【leetcode前500】457. 环形数组是否存在循环

其实这种题,对于查找环的问题,我们应该立即想到快慢指针,但是对于一个整体的设计,确实没有一下子想出来。

1.如何去除重复路径的问题。我们观察数组元素是正数或者负数,因此我们用遍历置零的办法去掉重复路径搜索。

2.同方向的问题。题目中要求成环条件是下标是同一方向的,也就是应当全为正数或者全为负数,遍历过程中应当与快指针节点以及快指针的下一个节点比较符号即可。

3.特殊情况比如[2,1],一直重复2-2-2....这样是要过滤掉的

class Solution:
    def circularArrayLoop(self, nums: List[int]) -> bool:
        def next_index(i):
            return (i+nums[i])%len(nums)

        for i in range(len(nums)):
            n=nums[i]
            if n==0:
                continue
            s,f=i,next_index(i)
            while nums[s]*nums[f] >0 and nums[s]*nums[next_index(f)]>0:
                if s==f:
                    if s==next_index(s):
                        break
                    return True
                s= next_index(s)
                f=next_index(next_index(f))
            p=i
            while nums[p]*nums[next_index(p)]>0:
                tmp=p
                p=next_index(p)
                nums[tmp]=0
        return False

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值