java查找包含重复项的最小缺失数
这是一个面试问题,但我无法及时解决,因此将其发布在此处:
给定一个n个整数的排序数组,其中每个整数的范围为0到m-1
和m > n
。查找数组中缺少的最小数字
例子
输入:{0, 1, 2, 6, 9}
,n = 5
,m = 10
产出:3
输入:{4, 5, 10, 11}
,n = 4
,m = 12
输出:0
其代码如下:
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;
if (array[mid] > mid)
return findFirstMissing(array, start, mid);
else
return findFirstMissing(array, mid + 1, end);
}
现在的问题是,输入数组也可以有重复项:
input = [0, 1, 1, 2, 3, 3, 4, 5, 5, 7]
output = 6
我如何有效地解决它?可以应用什么样的优化
# 1 楼答案
此解决方案在
O(N)
时间内工作,并使用O(1)
额外内存:注意:
n
实际上被忽略,我使用了data.length
# 2 楼答案
解决方案
# 3 楼答案
可以很容易地证明,您必须在O(n)时间内完成此操作,因为如果不检查每个值,您无法区分两个表:
及