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.

  

  

 

posted @ 2021-03-26 16:09  灰人  阅读(245)  评论(0)    收藏  举报