【leetcode 287 】【寻找重复数】【双指针专题】

leetcode

题目链接

https://leetcode-cn.com/problems/find-the-duplicate-number/


解题思路与代码思路:

这道题的限制条件很多,很麻烦。采用了时间换空间,实际这样做的情况比较少

双指针法

要做两个动作,第一:找到环;第二:找到环的入口(即重复元素)

  1. 定义快慢指针,slow走一步,fast走两步,相等就跳出循环,快慢指针相遇说明重复元素一定在环内
  2. 定义新指针find,find和slow每次都走一步,它们相遇,就是那个环的入口。
  3. 为什么相遇就是环的入口?
    假设起点到环的入口(重复元素),需要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}{复杂度分析:}
  1. 双指针
  • 时间复杂度:O(N)
  • 空间复杂度:O(1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值