快慢指標演算法

喵了個咪同學發表於2019-02-12

快慢指標概念

快慢指標中的快慢指的是移動的步長,即每次向前移動速度的快慢。例如可以讓快指標每次沿連結串列向前移動2,慢指標每次向前移動1次。

快慢指標找連結串列環相關理論

參考連結

  • 快指標必然與慢指標相遇
  • 慢指標進入環後,快指標最多多繞一個圈
  • 若在頭結點和相遇結點分別設一指標,同步(單步)前進,則最後一定相遇在環入口結點
  • 找到連線點p後,求head到p的長度,再加上環的長度,即為連結串列的總長

應用案例

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

class Solution {
/**
        快慢指標思想, fast 和 slow 是指標, nums[slow] 表示取指標對應的元素
        注意 nums 陣列中的數字都是在 1 到 n 之間的(在陣列中進行遊走不會越界),
        因為有重複數字的出現, 所以這個遊走必然是成環的, 環的入口就是重複的元素, 
        即按照尋找連結串列環入口的思路來做
        **/
    public int findDuplicate(int[] nums) {
        int slow = nums[0]; //注意,這裡的起始是第一個數字
        int fast = nums[0];
        while(true){
            slow = nums[slow];
            fast = nums[nums[fast]];
            if(slow == fast){
                fast = nums[0]; //這裡也是從第一個數字開始
                while(slow != fast){  //兩個下標相等,此時是兩個指標第二次相遇的前一個位置,下一時刻就會相遇,返回此時的下標就是重複的數字
                    slow = nums[slow];
                    fast = nums[fast];
                }
                return slow;
            }
        }
    }
} 
複製程式碼

參考連結

相關文章