leetcode
题目链接
https://leetcode-cn.com/problems/find-the-duplicate-number/
解题思路与代码思路:
这道题的限制条件很多,很麻烦。采用了时间换空间,实际这样做的情况比较少
双指针法
要做两个动作,第一:找到环;第二:找到环的入口(即重复元素)
- 定义快慢指针,slow走一步,fast走两步,相等就跳出循环,快慢指针相遇说明重复元素一定在环内
- 定义新指针find,find和slow每次都走一步,它们相遇,就是那个环的入口。
- 为什么相遇就是环的入口?
假设起点到环的入口(重复元素),需要m步。此时slow走了n+m步,其中n是环的周长c的整数倍,所以相当于slow走了m步到达入口,再走了n步(就是跑了几个圈,还是回到那个为位置)。所以相遇时一定是环的入口。
代码:
双指针
class Solution:
def findDuplicate(self, nums: List[int]) -> int:
slow = nums[0]
fast = nums[nums[0]]
while slow != fast:
slow = nums[slow]
fast = nums[nums[fast]]
find = 0
while find != slow:
find= nums[find]
slow = nums[slow]
return slow
复 杂 度 分 析 : \color{red}{复杂度分析:} 复杂度分析:
- 双指针
- 时间复杂度:O(N)
- 空间复杂度:O(1)