题目链接
寻找重复数
题目描述
注意点
- nums 中 只有一个整数 出现 两次或多次 ,其余整数均只出现 一次
- 不修改 数组 nums 且只用常量级 O(1) 的额外空间
解答思路
- 参照题解可以将本题的数组抽象为链表,由于nums中只有一个整数出现多次,所以抽象为链表后一定有环,过程如下图所示:
- 判断链表是否有环可以使用快慢指针,环的起点就是本题要找的重复数,寻找环的起点也是用到寻找链表中是否有环的知识,在快慢指针相遇后,从链表起点处新增一个指针开始移动,同时慢指针也开始移动,当两个指针相遇时就是链表中环的起点
代码
class Solution {
public int findDuplicate(int[] nums) {
int slow = nums[0];
int fast = nums[nums[0]];
while (slow != fast) {
slow = nums[slow];
fast = nums[nums[fast]];
}
int pre1 = 0;
int pre2 = slow;
while (pre1 != pre2) {
pre1 = nums[pre1];
pre2 = nums[pre2];
}
return pre1;
}
}
关键点
- 将本题抽象成链表
- 双指针寻找环起点位置