題目:
在一個長度爲n的數組裏的所有數字都在0到n-1的範圍內。 數組中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出數組中任意一個重複的數字。 例如,如果輸入長度爲7的數組{2,3,1,0,2,5,3},那麼對應的輸出是重複的數字2或者3。
根據題目中的信息,數組長度爲n,所有數字都在0到n-1之間,可以利用現有數組設置標誌,當一個數字被訪問過後,可以設置對應位上的數加n,之後再遇到相同的數時,會發現對應位上的數已經大於等於n了,那麼直接返回這個數即可。 時間複雜度爲O(n),空間複雜度爲O(1),不需要輔助空間。
代碼:
int duplicate(int numbers[],int length)//
{
if(length < 0)
return -1;//若數組爲空,則返回-1
for(int i = 0; i < length; i++)
{
int index = numbers[i];//記錄當前數值
if(length <= index)//若當前數值大於數組長度,則將其數值減去數組長度
{
index -= length;
}
if(length <= numbers[index])//若以當前數值爲下標的數值大於或等於數組長度,則返回當前數值
{
return index;
}
numbers[index] += length;//將以當前數值爲下標的數值加上數組長度
}
return -1;
}