《劍指offer》——數組中重複的數字

題目:
在一個長度爲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;
}
發佈了82 篇原創文章 · 獲贊 6 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章