我從codefights解決了這個問題:爲什麼我的算法O(1)額外的空間複雜度?
注意:寫一個O(n)時間複雜度和O(1)額外的空間複雜性的解決方案,因爲這是在真正的面試時你會被要求做的。
給定一個數組a,它只包含範圍從1到a.length的數字,找到第二個匹配項具有最小索引的第一個重複數。換句話說,如果有多個重複的號碼,則返回第二次出現的索引小於第二次出現的次數。如果沒有這樣的元素,則返回-1。
int firstDuplicate(int[] a) {
HashSet z = new HashSet();
for (int i: a) {
if (z.contains(i)){
return i;
}
z.add(i);
}
return -1;
}
我的解決方案通過了所有的測試。但是我不明白我的解決方案如何滿足O(1)額外的空間複雜度要求。哈希表的大小與輸入成正比,所以我認爲它是O(n)空間複雜度。 Codefights是否錯誤地測試了我的算法,還是我誤解了一些東西?
'只有數字範圍從1到a.length' - 您能否澄清一下? – xenteros
根據我的經驗,空間限制通常由在線評委測試。他們大多是在那裏,所以你知道在實際的採訪中,你可能會被要求這樣做。你是對的,你的算法顯然不使用額外的額外空間。 – Shalan
@xenteros關於這個問題還不清楚嗎? – Sendai