457. 环形数组是否存在循环

题目链接 457. 环形数组是否存在循环
思路 思维题-快慢指针
题解链接 【负雪明烛】动画题解:快慢指针
关键点 1. 将题意中移动规则抽象为nextpos 2. 限制条件的检查:同号 且 循环节点数量大于\(1\) 3. 鸽巢原理:只需要循环\(n\)
时间复杂度 \(O(n)\)
空间复杂度 \(O(1)\)

代码实现:

class Solution:
    def circularArrayLoop(self, nums: List[int]) -> bool:
        n = len(nums)

        def nextpos(i):
            return (i + nums[i] + n) % n
        
        for i, num in enumerate(nums):
            slow, fast = i, nextpos(i)
            while nums[fast] * nums[slow] > 0 and nums[nextpos(fast)] * nums[slow] > 0:
                if fast == slow:
                    if slow == nextpos(slow):
                        break
                    return True
                slow = nextpos(slow)
                fast = nextpos(nextpos(fast))
        
        return False
posted @ 2024-09-12 01:01  WrRan  阅读(3)  评论(0编辑  收藏  举报