題目描述
在乙個長度為n的陣列裡的所有數字都在0到n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。 例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。
解決方案
1、最簡單的辦法就是把輸入的陣列排序,然後從頭到尾掃瞄陣列很容易地找出重複的數字。時間複雜度為o(nlogn)。
2、利用雜湊表,從頭到尾按順序掃瞄陣列的每個數字,每掃瞄到乙個數字,都可以用o(1)的時間來判斷雜湊表裡是否包含該數字。如果不包含,就把它加入,如果包含,就找到了乙個重複的數字。時間複雜度為o(n),但需要額外的乙個o(n)的雜湊表。
3、利用類似於桶排序的原理,陣列中的所有數字都為0到n-1,可以把這些數字當做陣列下標,數值用來統計個數,即i為下標,a[i]為個數,如果a[i]>1,則i為相應的重複數字。時間複雜度為o(n),空間複雜度為o(n)。
//a為該陣列 length為陣列長度 result為找到的乙個重複數字
bool fuction1(int a, int length, int *result)
; for (int i = 0; i < length; i++)
for (int i = 0; i < length; i++) }
return false;
}
4、最好的方法當然最後出場了。時間複雜度o(n),空間複雜度o(1)。先上**。
bool fuction2(int a,int length,int *result)
if (a[i] == a[a[i]])
int t = a[a[i]];
a[a[i]] = a[i];
a[i] = t;
} }return false;
}
注意陣列長度為n,且數值都在0到n-1,如果沒有重複,排序完後數字i應該出現在下標為i的地方,即陣列第0個元素應為0,第1個元素應為1……按照這個順序把該陣列進行排序,一直排下去,如果兩個要交換的值是一樣的,就代表這個值是重複的。雖然是兩重迴圈,但是每個元素最多換兩次位置就能找到屬於自己的位置,因此時間複雜度為o(n)。
5、看到的某個大佬的操作,真的6p。
int find_dup(int numbers, int length)
if (numbers[index] >= length)
numbers[index] = numbers[index] + length;
} return -1;
}
時間複雜度o(n),空間複雜度o(1)。
主要思想就是如果乙個長度為n,值為0到n-1,且沒有重複的陣列,i從0到n-1,對應的a[0]到a[n-1]不會指向同乙個a[i]兩次。這裡,對於i,先讓a[a[i]]加上一陣列長度length,如果後面這個i再次出現,那麼a[a[i]]必定比length大,那麼i就位重複的數。
缺點:對原陣列數值進行了更改,本題的核心是查詢問題,引數型別很有可能為const,這樣做有偷雞的意思。不過真的很難想到。
面試題3 陣列中重複的數字
在乙個長度為n的陣列裡的所有數字都在0 n 1範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是重複的數字2或者3。1.方法一 把輸入的資料進行排序,排序後再判斷有無重複的數字,時間複雜...
面試題03 陣列中重複的數字
題目二 不修改陣列找出重複的數字 相似題目 在乙個長度為n的陣列裡的所有數字都在0 n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。解決這個問題的乙個簡單的...
面試題03 陣列中重複的數字
在乙個長度為 n 的陣列 nums 裡的所有數字都在 0 n 1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。只輸出第乙個重複的數字 示例 1 輸入 2,3,1,0,2,5,3 輸出 2解決辦法 使用hashset 如果出現...