287. 寻找重复数
-
由题中数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。
-
维护一个映射关系
f(n)= index -> num
,其中数组的下标index,数字为num
当一个数组里有环的时候,例如
[1,3,4,2,2] [3,1,3,4,2]
映射为:
0 -> 1 0 -> 3
1 -> 3 1 -> 1
2 -> 4 2 -> 3
3 -> 2 3 -> 4
4 -> 2 4 -> 2
得链表:
我们得到入环点的数 = 重复的数
这道题就变成了快慢指针找入环点的题,只是快慢指针表示不同
public int findDuplicate(int[] nums) {
int slow = 0;//slow指针从0开始
int fast = 0;//fast指针从0开始
slow = nums[slow]; //慢指针一次走一步
fast = nums[nums[fast]]; //快指针一次走两步
while(slow != fast){ //当快慢指针相遇的时候得到结果,如果没相遇则一直循环
//有题目可知这个数组里绝对有一个重复的,所以必定成环
slow = nums[slow]; //慢指针一次走一步
fast = nums[nums[fast]]; //快指针一次走两步
}
fast = 0; //让快指针回到开头
while(slow != fast){ //当快慢指针相遇的时候得到结果,没相遇则一直循环
slow = nums[slow]; //慢指针一次走一步
fast = nums[fast]; //快指针一次走两步
}
return slow; //最终相遇返回slow就是成环的点
}
标签:slow,nums,int,fast,链表,数组,leetcode,287,指针 From: https://www.cnblogs.com/phonk/p/16776580.html