原题
思路
具体参考此题解
- 将下标与数值的映射变成一个有环链表(这里是因为存在前置条件,只有一个数重复可以得到只存在一个环)
- 数组存在重复整数 <–> 链表存在环
- 找到重复整数 <–> 找到链表环入口
代码
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int fast = 0, slow = 0;
slow = nums[slow];
fast = nums[nums[fast]];
while (slow != fast) {
slow = nums[slow];
fast = nums[nums[fast]];
}
int pre1 = 0, pre2 = slow;
while (pre1 != pre2) {
pre1 = nums[pre1];
pre2 = nums[pre2];
}
return pre1;
}
};
运行截图

该问题通过将数组转化为有环链表来解决,利用快慢指针找到链表的环,然后再次遍历找到环的入口,从而找出重复的数字。代码中,`fast`和`slow`指针用于找环,`pre1`和`pre2`用于找环入口。
1226

被折叠的 条评论
为什么被折叠?



