[英]Why is my algorithm O(1) additional space complexity?
我從代碼戰中解決了這個問題:
注意:編寫一個具有O(n)時間復雜度和O(1)額外空間復雜度的解決方案,因為這是在實際面試中會要求您執行的操作。
給定一個數組a,其中只包含從1到a.length范圍內的數字,請找到第一個重復的數字,其第二次出現的索引最小。 換句話說,如果重復的數字多於1個,則返回其第二次出現的索引小於另一個數字的第二次出現的索引的數字。 如果沒有這樣的元素,則返回-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)空間復雜度。 代碼戰是否對我的算法進行了錯誤測試,還是我誤會了某些東西?
您的代碼沒有O(1)輔助空間復雜度,因為如果給定所有不同元素的數組,則該哈希集可以增長到大小n。
我的猜測是,在線測試基礎架構沒有檢查內存使用情況,或者沒有正確檢查內存使用情況。 如果要滿足空間限制,則需要返回並嘗試以其他方式解決問題。
作為提示,請考慮重新排列數組元素。
如果您能夠修改傳入數組,則可以解決O(n)
時間復雜度的問題,並且不使用外部存儲器 。
public static int getFirstDuplicate(int... arr) {
for (int i = 0; i < arr.length; i++) {
int val = Math.abs(arr[i]);
if (arr[val - 1] < 0)
return val;
arr[val - 1] = -arr[val - 1];
}
return -1;
}
從技術上講這是不正確的,有兩個原因。
首先,根據數組中的值,當int
變為Integer
並添加到HashSet
時,可能會產生開銷。
其次,雖然額外的內存在很大程度上是與HashSet
相關的開銷,但該開銷與集合的大小成線性比例。 (請注意,由於數組中已經存在這些元素,因此我並未對此進行計數。)
通常,通過設置其可使用的內存量限制來測試這些內存約束。 我希望這樣的解決方案會低於上述閾值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.