數組中查找重複數字的問題

題目


在一個長度爲 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上看到的題目,自己實現了一下

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章