原题
思路
具体参考此题解
- 将下标与数值的映射变成一个有环链表(这里是因为存在前置条件,只有一个数重复可以得到只存在一个环)
- 数组存在重复整数 <–> 链表存在环
- 找到重复整数 <–> 找到链表环入口
代码
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;
}
};