LeeCode 287 快慢指针

题意

传送门 LeeCode 287

题解

将数列的索引与值看做链表的值与指针。考虑索引 0 0 为非重复数字的情况,则该数字索引处的值不能指向自身,以此类推,直到遇到所求重复数字又指向以遍历过的节点;考虑索引 0 0 为重复数字的情况,当节点都指向自身;都可以判环找到入环节点解决。

判环使用快慢指针,速度差为 1 1 保证出现环时快指针可以追上慢指针;此时相遇位置与起点在前进方向上与入环节点的距离一致。

class Solution {
public:
    int findDuplicate(vector<int>& nums) {
        int f = 0, s = 0;
        do{
            f = nums[nums[f]];
            s = nums[s];
        }while(f != s);
        int l = 0, r = s;
        while(l != r){
            l = nums[l];
            r = nums[r];
        }
        return r;
    }
};
发布了110 篇原创文章 · 获赞 1 · 访问量 2038

猜你喜欢

转载自blog.csdn.net/neweryyy/article/details/105567094