给定一个包含 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 = 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.
?>
Javascript
输出:
Missing number: 7
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。