题意
传送门 LeeCode 287
题解
将数列的索引与值看做链表的值与指针。考虑索引 为非重复数字的情况,则该数字索引处的值不能指向自身,以此类推,直到遇到所求重复数字又指向以遍历过的节点;考虑索引 为重复数字的情况,当节点都指向自身;都可以判环找到入环节点解决。
判环使用快慢指针,速度差为 保证出现环时快指针可以追上慢指针;此时相遇位置与起点在前进方向上与入环节点的距离一致。
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;
}
};