287. 寻找重复数/C++

287. 寻找重复数/C++_第1张图片

一开始以为拿set随便做,但是set的空间是O(n)的。
看了下评论才知道是用环形链表来做,十分巧妙。

假如将index的后继看作是nums[index],那么就形成了一个抽象的环形链表。
以1,3,4,2,2为例,其环形链表为1->3->[2]->4->[2]->4->…,其中2就是环形的入口。
如此题目就转化为求环形链表的入口了。

环形链表的入口详见142. 环形链表 II/C++

int findDuplicate(vector<int>& nums) {
    int slow=0,fast=0;
    while(true){
        slow=nums[slow];
        fast=nums[nums[fast]];
        if(slow == fast) break;
    }
    for(int i=0;i!=slow;i=nums[i])
        slow=nums[slow];
    return slow;
}

你可能感兴趣的:(双指针,LeetCode/C++)