287. 尋找重複數

中等 位運算 數組 雙指針 二分搜

思路

給定數組 nums=[2,3,1,5,4,2]index=[0,1,2,3,4,5]\begin{aligned} nums = & [2,3,1,5,4,2]\\ index = & [0,1,2,3,4,5] \end{aligned} ,重複的數字為 22

因為indexnums的範圍大致相同,可以利用快慢指針去找到目標數字。

nums[i]就是下次要跳轉的目標位置。

比如現在從index = 0出發,看到數字 2,就來到 nums[2]

再看到數字 11 ,來到nums[1],如此往下前進。

由於有重複數字的存在,最後會進入一個迴圈,重複的數字,就是環的起點。

找環起點的算法在 142. 環形鏈表 II 有提到。

圖片

程式碼

快慢指針

class Solution {
public:
    int findDuplicate(vector<int>& nums) {
        int slow = nums[0], fast = nums[nums[0]];
        while(slow != fast) {
            slow = nums[slow];
            fast = nums[nums[fast]];
        }
        slow = 0;
        while(slow != fast) {
            slow = nums[slow];
            fast = nums[fast];
        }
        return slow;
    }
};

複雜度分析

  • 時間複雜度:O(n)O(n)
  • 空間複雜度:O(1)O(1)

顯示設定

背景線條
顯示背景網格線條
懸停發光
滑鼠懸停時顯示霓虹效果
聚光燈
跟隨滑鼠的聚光燈效果
背景透明度
開啟透明玻璃效果
主題顏色
自訂主要顏色