你将获得一个包含n个不同整数的数组,其中每个整数满足0 <= x_i < 2 * n。打印出所有在这个数组中不存在的0 <= x < 2 * n的整数。
举例: 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,使得数组的每个元素被读写的次数都小于C,因此基数排序不可行。 空间复杂度O(1) - 你可以修改初始数组,但是sorted(initial_array)必须等于sorted(array_after_executing_program),并且你不能在这个数组中存储范围在[0, 2n)之外的整数(想象一下它是一个uint32_t数组)。
我看到了很多复杂的解决方案,但是后来我找到了这个:
举例: 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,使得数组的每个元素被读写的次数都小于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
,很明显它根本没有输出缺失的数字。 - Lasse V. Karlsen