題目連結 | 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