Encuentra el elemento que falta en una array ordenada de números consecutivos

Dada una array arr[] de n enteros distintos. Los elementos se colocan secuencialmente en orden ascendente y falta un elemento. La tarea es encontrar el elemento que falta.
Ejemplos: 
 

Entrada: arr[] = {1, 2, 4, 5, 6, 7, 8, 9} 
Salida: 3
Entrada: arr[] = {-4, -3, -1, 0, 1, 2} 
Salida: -2
Entrada: arr[] = {1, 2, 3, 4} 
Salida: -1 
No falta ningún elemento. 
 

Principios: 
 

  • Busque inconsistencias: idealmente, la diferencia entre cualquier elemento y su índice debe ser arr[0] para cada elemento. 
    Ejemplo
    A[] = {1, 2, 3, 4, 5} -> Consistente 
    B[] = {101, 102, 103, 104} -> Consistente 
    C[] = {1, 2, 4, 5, 6 } -> Incoherente como C[2] – 2 != C[0] es decir, 4 – 2 != 1 
     
  • Encontrar inconsistencias ayuda a escanear solo la mitad de la array cada vez en O (logN).

Algoritmo 
 

  1. Encuentra el elemento medio y verifica si es consistente.
  2. Si el elemento intermedio es coherente, compruebe si la diferencia entre el elemento intermedio y su siguiente elemento es mayor que 1, es decir, compruebe si arr[mid + 1] – arr[mid] > 1 
    • En caso afirmativo, entonces arr[mid] + 1 es el elemento que falta.
    • De lo contrario, tenemos que escanear la mitad derecha del elemento del medio y saltar al paso 1.
  3. Si el elemento intermedio es inconsistente, verifique si la diferencia entre el elemento intermedio y su elemento anterior es mayor que 1, es decir, verifique si arr[mid] – arr[mid – 1] > 1 
    • En caso afirmativo, entonces arr[mid] – 1 es el elemento que falta.
    • Si no es así, tenemos que escanear la array de la mitad izquierda del elemento central y saltar al paso 1.

A continuación se muestra la implementación del enfoque anterior: 
 

C++

// CPP implementation of the approach
#include<bits/stdc++.h>
using namespace std;
 
// Function to return the missing element
int findMissing(int arr[], int n)
{
 
    int l = 0, h = n - 1;
    int mid;
 
    while (h > l)
    {
 
        mid = l + (h - l) / 2;
 
        // Check if middle element is consistent
        if (arr[mid] - mid == arr[0])
        {
 
            // No inconsistency till middle elements
            // When missing element is just after
            // the middle element
            if (arr[mid + 1] - arr[mid] > 1)
                return arr[mid] + 1;
            else
            {
                // Move right
                l = mid + 1;
            }
        }
        else
        {
 
            // Inconsistency found
            // When missing element is just before
            // the middle element
            if (arr[mid] - arr[mid - 1] > 1)
                return arr[mid] - 1;
            else
            {
                // Move left
                h = mid - 1;
            }
        }
    }
 
    // No missing element found
    return -1;
}
 
// Driver code
int main()
{
    int arr[] = { -9, -8, -7, -5, -4, -3, -2, -1, 0 };
    int n = sizeof(arr)/sizeof(arr[0]);
 
    cout << (findMissing(arr, n));
}
     
// This code iscontributed by
// Surendra_Gangwar

Java

// Java implementation of the approach
class GFG {
 
    // Function to return the missing element
    public static int findMissing(int arr[], int n)
    {
 
        int l = 0, h = n - 1;
        int mid;
 
        while (h > l) {
 
            mid = l + (h - l) / 2;
 
            // Check if middle element is consistent
            if (arr[mid] - mid == arr[0]) {
 
                // No inconsistency till middle elements
                // When missing element is just after
                // the middle element
                if (arr[mid + 1] - arr[mid] > 1)
                    return arr[mid] + 1;
                else {
 
                    // Move right
                    l = mid + 1;
                }
            }
            else {
 
                // Inconsistency found
                // When missing element is just before
                // the middle element
                if (arr[mid] - arr[mid - 1] > 1)
                    return arr[mid] - 1;
                else {
 
                    // Move left
                    h = mid - 1;
                }
            }
        }
 
        // No missing element found
        return -1;
    }
 
    // Driver code
    public static void main(String args[])
    {
        int arr[] = { -9, -8, -7, -5, -4, -3, -2, -1, 0 };
        int n = arr.length;
 
        System.out.print(findMissing(arr, n));
    }
}

Python3

# Python implementation of the approach
 
# Function to return the missing element
def findMissing(arr, n):
 
    l, h = 0, n - 1
    mid = 0
 
    while (h > l):
 
        mid = l + (h - l) // 2
 
        # Check if middle element is consistent
        if (arr[mid] - mid == arr[0]):
 
            # No inconsistency till middle elements
            # When missing element is just after
            # the middle element
            if (arr[mid + 1] - arr[mid] > 1):
                return arr[mid] + 1
            else:
 
                # Move right
                l = mid + 1
             
        else:
 
            # Inconsistency found
            # When missing element is just before
            # the middle element
            if (arr[mid] - arr[mid - 1] > 1):
                return arr[mid] - 1
            else:
 
                # Move left
                h = mid - 1
             
    # No missing element found
    return -1
 
# Driver code
arr = [-9, -8, -7, -5, -4, -3, -2, -1, 0 ]
n = len(arr)
 
print(findMissing(arr, n))
 
# This code is contributed
# by mohit kumar

C#

// C# implementation of the approach
using System;
 
class GFG
{
 
    // Function to return the missing element
    public static int findMissing(int[] arr, int n)
    {
 
        int l = 0, h = n - 1;
        int mid;
 
        while (h > l)
        {
 
            mid = l + (h - l) / 2;
 
            // Check if middle element is consistent
            if (arr[mid] - mid == arr[0])
            {
 
                // No inconsistency till middle elements
                // When missing element is just after
                // the middle element
                if (arr[mid + 1] - arr[mid] > 1)
                    return arr[mid] + 1;
                else
                {
 
                    // Move right
                    l = mid + 1;
                }
            }
            else
            {
 
                // Inconsistency found
                // When missing element is just before
                // the middle element
                if (arr[mid] - arr[mid - 1] > 1)
                    return arr[mid] - 1;
                else
                {
 
                    // Move left
                    h = mid - 1;
                }
            }
        }
 
        // No missing element found
        return -1;
    }
 
    // Driver code
    public static void Main()
    {
        int[] arr = { -9, -8, -7, -5, -4, -3, -2, -1, 0 };
        int n = arr.Length;
 
        Console.WriteLine(findMissing(arr, n));
    }
}
 
// This code is contributed by Code_Mech

PHP

<?php
// PHP implementation of the approach
 
// Function to return the missing element
function findMissing($arr, $n)
{
    $l = 0; $h = $n - 1;
 
    while ($h > $l)
    {
 
        $mid = floor($l + ($h - $l) / 2);
 
        // Check if middle element is consistent
        if ($arr[$mid] - $mid == $arr[0])
        {
 
            // No inconsistency till middle elements
            // When missing element is just after
            // the middle element
            if ($arr[$mid + 1] - $arr[$mid] > 1)
                return $arr[$mid] + 1;
            else
            {
 
                // Move right
                $l = $mid + 1;
            }
        }
        else
        {
 
            // Inconsistency found
            // When missing element is just before
            // the middle element
            if ($arr[$mid] - $arr[$mid - 1] > 1)
                return $arr[$mid] - 1;
            else
            {
 
                // Move left
                $h = $mid - 1;
            }
        }
    }
 
    // No missing element found
    return -1;
}
 
// Driver code
$arr = array( -9, -8, -7, -5, -
               4, -3, -2, -1, 0 );
$n = count($arr);
 
echo findMissing($arr, $n);
 
// This code is contributed by Ryuga
?>

Javascript

<script>
// JavaScript implementation of the approach
 
// Function to return the missing element
function findMissing(arr, n)
{
 
    let l = 0, h = n - 1;
    let mid;
 
    while (h > l)
    {
 
        mid = l + Math.floor((h - l) / 2);
 
        // Check if middle element is consistent
        if (arr[mid] - mid == arr[0])
        {
 
            // No inconsistency till middle elements
            // When missing element is just after
            // the middle element
            if (arr[mid + 1] - arr[mid] > 1)
                return arr[mid] + 1;
            else
            {
                // Move right
                l = mid + 1;
            }
        }
        else
        {
 
            // Inconsistency found
            // When missing element is just before
            // the middle element
            if (arr[mid] - arr[mid - 1] > 1)
                return arr[mid] - 1;
            else
            {
                // Move left
                h = mid - 1;
            }
        }
    }
 
    // No missing element found
    return -1;
}
 
// Driver code
    let arr = [ -9, -8, -7, -5, -4, -3, -2, -1, 0 ];
    let n = arr.length;
 
    document.write(findMissing(arr, n));
     
 
 
 
// This code is contributed by Surbhi Tyagi.
</script>
Producción: 

-6

 

Complejidad de tiempo: O(log(N) )
Espacio auxiliar: O(1) 

Publicación traducida automáticamente

Artículo escrito por Neelansh Gupta 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 *