在乙個長度為n的陣列裡的所有數字都在0到n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。 例如,如果輸入長度為7的陣列,那麼對應的輸出的重複的數字為2或3。
分析:
1. 用排序,但是最快的排序也要nlog(n),可不可以 o(1)
2. 用雜湊,但是需要o(n)的輔助空間,可不可以 不借助輔助空間
3. 因為數字的區間為0~n-1,如果沒有重複的數字,那麼陣列在排序後數字 k 將出現在 k 下標處,這樣的話如果乙個位置有多個數字則證明有重複陣列;
實現思路:當掃瞄到下標 k時,首先比較該位置上的數字 m是否等於k,如果是,則掃瞄下乙個數字;如果不是,則用數字m和下標為 m的處的數字比較。如果相等,則找到了乙個重複數字(因為數字m在k下標和m下標都出現過);如果不相等,則將k 和 m下標數字交換,把m 放在屬於它的位置上;接下來重複上述過程。
**如下:
bool duplicate(int numbers, int length, int* duplication)
for(int i = 0; i < length;i++)
//交換資料
int temp = numbers[i];
numbers[i] = numbers[temp]; //numbers[i] = numbers[numbers[i]]
numbers[temp] = temp; //numbers[numbers[i]] = temp}}
}
不修改陣列的情況下找出重複的數字
有乙個長度為 n+1 的陣列裡的所有數字都在1~n的範圍內,所以陣列中至少有乙個數字是重複的。請找出任意乙個重複的數字,但是不能修改陣列。
分析:
1. 輔助陣列,來統計,但是需要o(n)的輔助空間
2. 長度為 n+1 的陣列裡的所有數字都在1~n的範圍內,所以陣列中至少有乙個數字是重複的,所以數字的範圍很關鍵,我們可以把數字的大小區間使用進行劃分。
**實現:
int countrange(const int* numbers, int length, int start, int end)
return count;
}int getduplication(const int* numbers, int length)
//二分選區間
if (count > (middle - start + 1)) //middle - start + 1 指的是區間數字個數
end = middle;
else
start = middle + 1;
} return -1;
}
說明:此**不能保證找到所有重複的數字,缺陷還是比較大的,好處是快速,空間複雜度低,根據需求選擇演算法很重要。 陣列 陣列中重複的數字
在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。思路 python 實現 an highlighted block ...
陣列中重複的數字
在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道哪幾個 數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。例如 如果輸入長度為7的陣列,那麼對應的輸出是重複的數字2或者3。include iostream using namespace ...
陣列中重複的數字
題目 在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是重複的數字2或者3。思路 用雜湊表解決的時間複雜度和空間複雜度為o n 因為陣列中...