題目
在一個長度爲 n 的數組裏的所有數字都在 0 到 n-1 的範圍內。數組中某些數字是重複的,但不知道有幾個數字是重複的,也不知道每個數字重複幾次。請找出數組中任意一個重複的數字。例如,如果輸入長度爲 7 的數組 {2, 3, 1, 0, 2, 5},那麼對應的輸出是第一個重複的數字 2。
要求複雜度爲 O(N) + O(1),也就是時間複雜度 O(N),空間複雜度 O(1)。因此不能使用排序的方法,也不能使用額外的標記數組。牛客網討論區這一題的首票答案使用 nums[i] + length 來將元素標記,這麼做會有加法溢出問題。
解題思路
這種數組元素在 [0, n-1] 範圍內的問題,可以將值爲 i 的元素放到第 i 個位置上
代碼實現
int find(int temp[], int size)
{
if(temp == NULL && size == 0)
return -1;
for(int i = 0; i < size; i++)
{
while(temp[i] != i)
{
if(temp[i] == temp[temp[i]])
return temp[i];
else
swap(temp[i], temp[temp[i]]);
}
}
return -1;
}
在GitHub上看到的題目,自己實現了一下