Encuentre un punto fijo (valor igual al índice) en una array dada | Duplicados Permitidos

Dada una array de n enteros ordenados en orden ascendente, escriba una función que devuelva un punto fijo en la array, si hay algún punto fijo presente en la array, de lo contrario, devuelva -1. Punto fijo en una array es un índice i tal que arr[i] es igual a i. Tenga en cuenta que los enteros en la array pueden ser negativos. 
Ejemplos: 
 

  Input: arr[] = {-10, -5, 0, 3, 7}
  Output: 3  // arr[3] == 3 

  Input: arr[] = {-10, -5, 2, 2, 2, 3, 4, 7, 9, 12, 13}
  Output: 2  // arr[2] == 2 

  Input: arr[] = {-10, -5, 3, 4, 7, 9}
  Output: -1  // No Fixed Point

Tenemos una solución para encontrar un punto fijo en una array de elementos distintos . En esta publicación, se analiza la solución para una array con valores duplicados.
Considere arr[] = {-10, -5, 2, 2, 2, 3, 4, 7, 9, 12, 13}, arr[mid] = 3 Si los elementos no son distintos, entonces vemos arr[
mid ] < mid, no podemos concluir de qué lado está el fijo. Puede ser del lado izquierdo o del lado derecho.
Sabemos con certeza que dado que arr[5] = 3, arr[4] no puede ser un índice mágico porque arr[4] debe ser menor o igual que arr[5] (la array está ordenada).
Entonces, el patrón general de nuestra búsqueda sería: 
 

  • Lado izquierdo: inicio = inicio, final = min (arr [índice medio], índice medio-1)
  • Lado derecho: inicio = max(arr[midIndex], midIndex+1), end = end

A continuación se muestra el código para el algoritmo anterior. 
 

C++

// CPP Program to find magic index.
#include <bits/stdc++.h>
using namespace std;
 
int magicIndex(int* arr, int start, int end)
{
    // If No Magic Index return -1;
    if (start > end)
        return -1;
 
    int midIndex = (start + end) / 2;
    int midValue = arr[midIndex];
 
    // Magic Index Found, return it.
    if (midIndex == midValue)
        return midIndex;
 
    // Search on Left side
    int left = magicIndex(arr, start, min(midValue,
                                     midIndex - 1));
 
    // If Found on left side, return.
    if (left >= 0)
        return left;
 
    // Return ans from right side.
    return magicIndex(arr, max(midValue, midIndex + 1),
                                                  end);
}
 
// Driver program
int main()
{
    int arr[] = { -10, -5, 2, 2, 2, 3, 4, 7,
                                 9, 12, 13 };
    int n = sizeof(arr) / sizeof(arr[0]);
    int index = magicIndex(arr, 0, n - 1);
    if (index == -1)
        cout << "No Magic Index";
    else
        cout << "Magic Index is : " << index;
    return 0;
}

Java

// Java Program to find magic index.
 
class GFG {
     
    static int magicIndex(int arr[], int start, int end)
    {
        // If No Magic Index return -1;
        if (start > end)
            return -1;
     
        int midIndex = (start + end) / 2;
        int midValue = arr[midIndex];
     
        // Magic Index Found, return it.
        if (midIndex == midValue)
            return midIndex;
     
        // Search on Left side
        int left = magicIndex(arr, start, Math.min(midValue,
                                            midIndex - 1));
     
        // If Found on left side, return.
        if (left >= 0)
            return left;
     
        // Return ans from right side.
        return magicIndex(arr, Math.max(midValue,
                                midIndex + 1),end);
    }
 
    // Driver code
    public static void main (String[] args)
    {
        int arr[] = { -10, -5, 2, 2, 2, 3, 4, 7,
                    9, 12, 13 };
        int n = arr.length;
        int index = magicIndex(arr, 0, n - 1);
        if (index == -1)
            System.out.print("No Magic Index");
        else
            System.out.print("Magic Index is : "+index);
    }
}
 
// This code is contributed by Anant Agarwal.

Python 3

# Python 3 Program to find
# magic index.
 
def magicIndex(arr, start, end):
 
    # If No Magic Index return -1
    if (start > end):
        return -1
 
    midIndex = int((start + end) / 2)
    midValue = arr[midIndex]
 
    # Magic Index Found, return it.
    if (midIndex == midValue):
        return midIndex
 
    # Search on Left side
    left = magicIndex(arr, start, min(midValue,
                                midIndex - 1))
 
    # If Found on left side, return.
    if (left >= 0):
        return left
 
    # Return ans from right side.
    return magicIndex(arr, max(midValue,
                        midIndex + 1),
                                    end)
 
# Driver program
arr = [-10, -5, 2, 2, 2, 3, 4, 7, 9, 12, 13]
n = len(arr)
 
index = magicIndex(arr, 0, n - 1)
 
if (index == -1):
    print("No Magic Index")
else:
    print("Magic Index is :", index)
 
# This code is contributed by Smitha Dinesh Semwal

C#

// C# Program to find magic index.
using System;
 
class GFG {
     
    static int magicIndex(int []arr, int start,
                                    int end)
    {
        // If No Magic Index return -1;
        if (start > end)
            return -1;
     
        int midIndex = (start + end) / 2;
        int midValue = arr[midIndex];
     
        // Magic Index Found, return it.
        if (midIndex == midValue)
            return midIndex;
     
        // Search on Left side
        int left = magicIndex(arr, start, Math.Min(midValue,
                                            midIndex - 1));
     
        // If Found on left side, return.
        if (left >= 0)
            return left;
     
        // Return ans from right side.
        return magicIndex(arr, Math.Max(midValue,
                                midIndex + 1),end);
    }
 
    // Driver code
    public static void Main ()
    {
        int []arr = { -10, -5, 2, 2, 2, 3,
                        4, 7, 9, 12, 13 };
         
        int n = arr.Length;
         
        int index = magicIndex(arr, 0, n - 1);
         
        if (index == -1)
            Console.WriteLine("No Magic Index");
        else
            Console.WriteLine("Magic Index is : " +
                                            index);
    }
}
 
// This code is contributed by vt_m.

PHP

<?php
// PHP Program to find magic index.
 
function magicIndex($arr, $start, $end)
{
     
    // If No Magic Index return -1;
    if ($start > $end)
        return -1;
 
    $midIndex = floor(($start + $end) / 2);
    $midValue = $arr[$midIndex];
 
    // Magic Index Found, return it.
    if ($midIndex == $midValue)
        return $midIndex;
 
    // Search on Left side
    $left = magicIndex($arr, $start,
            min($midValue, $midIndex - 1));
 
    // If Found on left side, return.
    if ($left >= 0)
        return $left;
 
    // Return ans from right side.
    return magicIndex($arr, max($midValue,
                     $midIndex + 1), $end);
}
     
    // Driver Code
    $arr = array(-10, -5, 2, 2, 2, 3,
                     4, 7, 9, 12, 13);
    $n = sizeof($arr);
    $index = magicIndex($arr, 0, $n - 1);
    if ($index == -1)
        echo "No Magic Index";
    else
        echo "Magic Index is : " , $index;
     
// This code is contributed by nitin mittal
?>

Javascript

<script>
// JavaScript Program to find magic index.
 
function magicIndex(arr, start, end)
{
    // If No Magic Index return -1;
    if (start > end)
        return -1;
 
    let midIndex = Math.floor((start + end) / 2);
    let midValue = arr[midIndex];
 
    // Magic Index Found, return it.
    if (midIndex == midValue)
        return midIndex;
 
    // Search on Left side
    let left = magicIndex(arr, start, Math.min(midValue,
                                    midIndex - 1));
 
    // If Found on left side, return.
    if (left >= 0)
        return left;
 
    // Return ans from right side.
    return magicIndex(arr, Math.max(midValue, midIndex + 1),
                                                end);
}
 
// Driver program
    let arr = [ -10, -5, 2, 2, 2, 3, 4, 7,
                                9, 12, 13 ];
    let n = arr.length;
    let index = magicIndex(arr, 0, n - 1);
    if (index == -1)
        document.write("No Magic Index");
    else
        document.write("Magic Index is : " + index);
 
 
 
 
// This code is contributed by Surbhi Tyagi.
</script>

Producción: 
 

Magic Index is : 2

 Complejidad de tiempo: O(N)

Espacio Auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por Aashish Chauhan y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *