每日一題:尋找重複數

給定一個包含 n + 1 個整數的數組 nums,其數字都在 1 到 n 之間(包括 1 和 n),可知至少存在一個重複的整數。假設只有一個重複的整數,找出這個重複的數。

示例1:
輸入: [1,3,4,2,2]
輸出: 2

示例2:
輸入: [3,1,3,4,2]
輸出: 3

說明:
不能更改原數組;
時間複雜度小於O(n^2);
空間複雜度爲O(1);
數組中只有一個重複數字,但它可能不只重複出現一次;

將index和nums[index]之間連一條邊,即從index可以轉移到nums[index]的值上的狀態。則這個鏈表中一定有環。這樣可以將問題轉化爲使用快慢指針找環的入口問題。

思路是:
先讓快指針一次走兩格,滿指針一次走一格,這樣先找到相遇點。然後將滿指針放回起點,開始慢指針和快指針都一次走一格,直到它們相遇,即找到了重複的數字。

class Solution {
public:
    int findDuplicate(vector<int>& nums) {
        int fast = 0;
        int slow = 0;
        while (1) {
            fast = nums[fast];
            fast = nums[fast];
            slow = nums[slow];
            if (slow == fast) break;
        }
        slow = 0;

        while (nums[slow] != nums[fast]) {
            slow = nums[slow];
            fast = nums[fast];
        }

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