287. 寻找重复数
分析
将问题抽象为一个带环的链表问题:
- 数组中的每个元素都可以看作指向下一个索引的指针:元素的值
nums[i]
指向索引nums[i]
- 因为数组中有重复的数字,这意味着某些索引会形成一个环。我们需要找到这个环的入口点,即重复的数字
利用 Floyd
判圈算法(龟兔赛跑算法)可以高效解决这个问题:
-
阶段 1:找到快慢指针的相遇点
- 定义两个指针:慢指针
a
每次移动一步,快指针b
每次移动两步 - 两个指针一定会在环中相遇。
- 定义两个指针:慢指针
-
阶段 2:找到环的入口点
- 将其中一个指针
a
重新指向起点0
,另一个指针b
保持在相遇点 - 两个指针每次都移动一步,相遇时的点即为环的入口点,也就是重复的数字
- 将其中一个指针
时间复杂度
快慢指针每次只移动一步或两步,最多经过两次遍历(一次寻找环,一次定位入口),时间复杂度为 O(n)
空间复杂度
空间复杂度为 O(1)
C++代码
|
|