给定一个长度为 𝑛+1 的数组nums
,数组中所有的数均在 1∼𝑛 的范围内,其中 𝑛≥1。
请找出数组中任意一个重复的数,但不能修改输入的数组。
数据范围
1≤𝑛≤1000
样例
给定 nums = [2, 3, 5, 4, 3, 2, 6, 7]。
返回 2 或 3。
代码:
class Solution {
public:
int duplicateInArray(vector<int>& nums) {
int fast=0;
int slow=0;
while(slow==0||fast!=slow)
{
fast=nums[nums[fast]];
slow=nums[slow];
}
fast=0;
while(fast!=slow)
{
fast=nums[fast];
slow=nums[slow];
}
return slow;
}
};
思路:把数组当成一个链表,nums[i]的值就是链表的next域的地址,也就是下标。 从题目可知,数组中一定会有重复的值,那么一定有俩下标(i,j),满足nums[i]==nums[j],那么可知链表一定存在环,就可以使用快慢指针来找到环的入口。
做法:定义fast和slow,fast每次走两步,slow每次走一步,因为存在环,所有二者一定可以相遇。相遇时,让fast回到起点,当fast和slow再次相遇时就找到了环的入口。