LeetCode 287. 寻找重复数 快慢指针

快慢指针来找到重复数的思路,一直没有很清楚,这回系统的学习了一下。
首先,快慢指针 又叫Floyd 判圈算法又叫龟兔赛跑算法。其目的是为了找到一个链表是否会有环。这个很好理解,一个快指针每次走两个next一个慢指针正常走一个next,如果链表中是有个环的,他们两个指针首先都会进入到环内,之后他们两个指针一定会在某个地方相遇(环内)。如果链表有结尾并没有环,快指针会先抵达结尾。
那么快慢指针怎么可以解决这道重复数的问题呢?这值得我们思考。
我们如果这样看:nums[i]的内容如果看成是这个节点的值,同时为下个节点的索引。我们发现以下两点:
1.在这道题中,nums是从1到n的整数,所以数组访问一定不会越界。 2.因为有某个元素重复,一定会形成环。
那么我们终于知道为什么能和Floyd 算法联系上一些了:这道题的数可以构造成一个环形链表的访问模式。那么之前不是说这个算法是用来判断的,我们已经确定一定有环了还用它干嘛?
因为我们的链表之所以会成为环,是因为有两个元素的值他们有着不同的index(如题中的2【3】和2【4】),正是因为元素重复了所以才构成了一个环。(如果没有重复元素,一定会走出这个长度,造成越界。)
而环的入口,正式我们想要找的那个重复元素。2xxx2 3xxxx3 4xxxxx4这个样子。
我们换一个样例,看如下这个样例。

我们的行走规则再上面已经说了,nums[i]的值就是下一个index,fast和slow第一次遇到的时候我们需要新建一个指针final从头开始走,知道final等于slow的时候他们相遇在环口,那么这个环口的元素就是重复的元素。重复的【3514】【3514】也可以肉眼看出。

这样我们就找到了重复的元素3.


浙公网安备 33010602011771号