【发布时间】:2016-04-10 17:07:34
【问题描述】:
给定一个包含 n 个唯一整数 0
例子:
find_missing([0]) = [1]
find_missing([0, 2, 4]) = [1, 3, 5] # 因为所有数字都是[0, 1, 2, 3, 4, 5]
find_missing([]) = []
find_missing([0, 1, 4, 5]) = [2, 3, 6, 7] # 因为所有的数字都是[0, 1, 2, 3, 4, 5, 6, 7]
怪癖是关于需求的:
时间复杂度 O(n) - 但是应该有一些与输入大小无关的固定常数 C,这样数组的每个元素都被写入/读取
空间复杂度 O(1) - 你可以修改初始数组,但是 sorted(initial_array) 必须等于 sorted(array_after_executing_program) 并且你不能在这个数组中存储范围 [0, 2n) 之外的整数(想象它是一个uint32_t 数组)。
我看到了很多复杂的解决方案,但后来我发现了这个:
public void printNotInArr(int[] arr) {
if(arr == null)
return null;
int len = arr.length;
int max = 2 * len;
for(int i = 0; i < len; i++) {
System.out.println(max - arr[i] - 1);
}
}
我相信这是最好的解决方案,但我不确定。我想知道为什么那行不通。
【问题讨论】:
-
由于它没有按照您的要求执行,因此根本不是解决方案。尝试传入
0, 3。你会得到3, 0,显然它根本不会输出丢失的数字。 -
输入是否保证排序,就像在所有示例中一样?
-
这与那个问题不一样,גלעד ברקן,因为另一个问题只删除了一个数字。这是一个完全不同的问题,有一个简单的解决方案。这里的这个不同,可能缺少多个数字。其他问题的简单解决方案在这里不起作用。
-
我现在看到,如果两个元素相互补充,它就会中断。 IE。如果 Max = 3,arr=[0, 3] 0+3 = 3 = Max。 arr=[1,2] -> rs[2,1] 和 2+1 = 3.