給出一個包含n個唯一整數的數組0 < = x_i < 2 * n。 打印所有整數0 < = x < 2 * n不存在於此數組中。查找數組中缺失的數字,時間複雜度爲O(N),空間複雜度爲O(1)
實施例:
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次,所以基數排序是不行的。 (1) - 你可以修改初始數組,但是sort(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',顯然它根本不會輸出丟失的數字。 –
輸入是否保證被排序,就像它在所有的例子中一樣? – Joni
這和這個問題https:// stackoverflow是一樣的。com/questions/3492302/easy-interview-question-got-harder-given-numbers-1-100-find-the-missing-numbe? –