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