📜  在排序的数组中找到缺失的数字

📅  最后修改于: 2021-04-23 06:23:26             🧑  作者: Mango

给定一个由n-1个整数组成的列表,这些整数在1到n的范围内。列表中没有重复项。列表中缺少整数之一。编写有效的代码以查找丢失的整数。
例子:

Input : arr[] = [1, 2, 3, 4, 6, 7, 8]
Output : 5

Input : arr[] = [1, 2, 3, 4, 5, 6, 8, 9]
Output : 7

一种简单的解决方案是应用所讨论的方法来查找未排序数组中的缺失元素。该解决方案的时间复杂度为O(n)。
一个有效的解决方案是基于我们在二分查找中看到的分治法,该解决方案的概念是:出现在缺失元素之前的元素将具有ar [i] – i = 1,而出现在缺失元素之后的元素将具有ar [i] – i = 1将具有ar [i] – i = 2。
该解决方案的时间复杂度为O(log n)

C++
// A binary search based program to find the
// only missing number in a sorted array of
// distinct elements within limited range.
#include 
using namespace std;
 
int search(int ar[], int size)
{
    int a = 0, b = size - 1;
    int mid;
    while ((b - a) > 1) {
        mid = (a + b) / 2;
        if ((ar[a] - a) != (ar[mid] - mid))
            b = mid;
        else if ((ar[b] - b) != (ar[mid] - mid))
            a = mid;
    }
    return (ar[a] + 1);
}
 
int main()
{
    int ar[] = { 1, 2, 3, 4, 5, 6, 8 };
    int size = sizeof(ar) / sizeof(ar[0]);
    cout << "Missing number:" << search(ar, size);
}


Java
// A binary search based program
// to find the only missing number
// in a sorted array of distinct
// elements within limited range.
import java.io.*;
 
class GFG
{
static int search(int ar[],
                  int size)
{
    int a = 0, b = size - 1;
    int mid = 0;
    while ((b - a) > 1)
    {
        mid = (a + b) / 2;
        if ((ar[a] - a) != (ar[mid] - mid))
            b = mid;
        else if ((ar[b] - b) != (ar[mid] - mid))
            a = mid;
    }
    return (ar[a] + 1);
}
 
// Driver Code
public static void main (String[] args)
{
    int ar[] = { 1, 2, 3, 4, 5, 6, 8 };
    int size = ar.length;
    System.out.println("Missing number: " +
                        search(ar, size));
}
}
 
// This code is contributed
// by inder_verma.


Python3
# A binary search based program to find
# the only missing number in a sorted
# in a sorted array of distinct elements
# within limited range
def search(ar, size):
    a = 0
    b = size - 1
    mid = 0
    while b > a + 1:
        mid = (a + b) // 2
        if (ar[a] - a) != (ar[mid] - mid):
            b = mid
        elif (ar[b] - b) != (ar[mid] - mid):
            a = mid
    return ar[a] + 1
 
# Driver Code
a = [1, 2, 3, 4, 5, 6, 8]
n = len(a)
 
print("Missing number:", search(a, n))
 
# This code is contributed
# by Mohit Kumar


C#
// A binary search based program
// to find the only missing number
// in a sorted array of distinct
// elements within limited range.
using System;
 
class GFG
{
static int search(int []ar,
                  int size)
{
    int a = 0, b = size - 1;
    int mid = 0;
    while ((b - a) > 1)
    {
        mid = (a + b) / 2;
        if ((ar[a] - a) != (ar[mid] - mid))
            b = mid;
        else if ((ar[b] - b) != (ar[mid] - mid))
            a = mid;
    }
    return (ar[a] + 1);
}
 
// Driver Code
static public void Main (String []args)
{
    int []ar = { 1, 2, 3, 4, 5, 6, 8 };
    int size = ar.Length;
    Console.WriteLine("Missing number: " +
                        search(ar, size));
}
}
 
// This code is contributed
// by Arnab Kundu


PHP
 1)
    {
        $mid = (int)(($a + $b) / 2);
        if (($ar[$a] - $a) != ($ar[$mid] -
                                   $mid))
            $b = $mid;
        else if (($ar[$b] - $b) != ($ar[$mid] -
                                        $mid))
            $a = $mid;
    }
    return ($ar[$a] + 1);
}
 
// Driver Code
$ar = array(1, 2, 3, 4, 5, 6, 8 );
$size = sizeof($ar);
echo "Missing number: ",
     search($ar, $size);
 
// This code is contributed by ajit.
?>


输出:

Missing number: 7