Programa en C++ para encontrar el número faltante más pequeño

Dada una array ordenada de n enteros distintos donde cada entero está en el rango de 0 a m-1 y m > n. Encuentra el número más pequeño que falta en la array. 

Ejemplos 

Input: {0, 1, 2, 6, 9}, n = 5, m = 10 
Output: 3

Input: {4, 5, 10, 11}, n = 4, m = 12 
Output: 0

Input: {0, 1, 2, 3}, n = 4, m = 5 
Output: 4

Input: {0, 1, 2, 3, 4, 5, 6, 7, 10}, n = 9, m = 11 
Output: 8

Gracias a Ravichandra por sugerir seguir dos métodos.

Método 1 (Usar búsqueda binaria ) 
Para i = 0 a m-1, realice una búsqueda binaria de i en la array. Si i no está presente en la array, devuelva i.
Complejidad del tiempo: O(m log n) 

Método 2 ( búsqueda lineal
Si arr[0] no es 0, devuelve 0. De lo contrario, recorra la array de entrada a partir del índice 0, y para cada par de elementos a[i] y a[i+1], encuentre la diferencia entre a ellos. si la diferencia es mayor que 1, entonces a[i]+1 es el número que falta. 
Complejidad de tiempo: O(n)

Método 3 (Usar búsqueda binaria modificada) 
Gracias a Yasein y Jams por sugerir este método. 
En el proceso de búsqueda binaria estándar, el elemento a buscar se compara con el elemento del medio y, en función del resultado de la comparación, decidimos si la búsqueda ha terminado o si vamos a la mitad izquierda o derecha. 
En este método, modificamos el algoritmo de búsqueda binaria estándar para comparar el elemento central con su índice y tomar una decisión sobre la base de esta comparación.

  • Si el primer elemento no es el mismo que su índice, devuelva el primer índice
  • De lo contrario, obtenga el índice medio, digamos medio
    • Si arr[mid] es mayor que mid, entonces el elemento requerido se encuentra en la mitad izquierda.
    • De lo contrario, el elemento requerido se encuentra en la mitad derecha.

C++

// C++ program to find the smallest elements
// missing in a sorted array.
#include<bits/stdc++.h>
using namespace std;
  
int findFirstMissing(int array[], 
                    int start, int end)
{
    if (start > end)
        return end + 1;
  
    if (start != array[start])
        return start;
  
    int mid = (start + end) / 2;
  
    // Left half has all elements 
    // from 0 to mid
    if (array[mid] == mid)
        return findFirstMissing(array, 
                            mid+1, end);
  
    return findFirstMissing(array, start, mid);
}
  
// Driver code
int main()
{
    int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 10};
    int n = sizeof(arr)/sizeof(arr[0]);
    cout << "Smallest missing element is " <<
        findFirstMissing(arr, 0, n-1) << endl;
}
  
// This code is contributed by
// Shivi_Aggarwal 
Producción

Smallest missing element is 8

Nota: este método no funciona si hay elementos duplicados en la array.
Complejidad de tiempo: O (Iniciar sesión)

Otro método: la idea es usar la búsqueda binaria recursiva para encontrar el número faltante más pequeño. A continuación se muestra la ilustración con la ayuda de los pasos:

  • Si el primer elemento de la array no es 0, entonces el número faltante más pequeño es 0.
  • Si los últimos elementos de la array son N-1, entonces el número faltante más pequeño es N.
  • De lo contrario, busque el elemento central del primer y último índice y verifique si el elemento central es igual al elemento deseado. es decir, primero + índice_medio.
    • Si el elemento del medio es el elemento deseado, entonces el elemento faltante más pequeño está en el espacio de búsqueda derecho del medio.
    • De lo contrario, el número faltante más pequeño está en el espacio de búsqueda izquierdo del medio.

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

C++

//C++ program for the above approach
#include <bits/stdc++.h>
  
using namespace std;
  
// Program to find missing element
int findFirstMissing(vector<int> arr , int start ,
                        int  end,int first)
{
  
  if (start < end)
  {
    int mid = (start + end) / 2;
  
    /** Index matches with value
      at that index, means missing
      element cannot be upto that po*/
    if (arr[mid] != mid+first)
      return findFirstMissing(arr, start,
                                 mid , first);
    else
      return findFirstMissing(arr, mid + 1,
                                 end , first);
  }
  return start + first;
  
}
  
// Program to find Smallest
// Missing in Sorted Array
int findSmallestMissinginSortedArray(vector<int> arr)
{
    
  // Check if 0 is missing
  // in the array
  if(arr[0] != 0)
    return 0;
  
  // Check is all numbers 0 to n - 1
  // are present in array
  if(arr[arr.size() - 1] == arr.size() - 1)
    return arr.size();
  
  int first = arr[0];
  
  return findFirstMissing(arr, 0, arr.size() - 1, first);
}
  
  
// Driver program to test the above function
int main()
{
    vector<int> arr = {0, 1, 2, 3, 4, 5, 7};
    int n = arr.size();
  
    // Function Call
    cout<<"First Missing element is : "<<findSmallestMissinginSortedArray(arr);
}
  
// This code is contributed by mohit kumar 29.
Producción

First Missing element is : 6

Complejidad de tiempo: O (Iniciar sesión) 

Consulte el artículo completo sobre ¡ Encuentre el número faltante más pequeño para obtener más detalles!

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 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 *