解题思路
对nums进行遍历
如果nums[i] == 0 or len(nums):
证明当前已经访问过or节点本身成为回路
跳过
否则:
从当前点开始进行回路
并记录为str类型的‘0’
如果在访问过程中
出现int 0==表示进入了之前步骤统计的无法组成环路的点,可以得出,当前也无法形成环路
or str‘0’表示进入了当前环路中的一个点,很明显,可以形成环路
如果无法形成环路的话,则把节点中的所有位置转int
其实主要思想就是利用0 和‘0’来区分之前已经统计过的位置以及当前的位置,来进行回路的判断
解法二中同样的思路,只不过加了一个set数组,理论上讲,时间复杂度降低,空间复杂度略微升高
解法1
class Solution(object):
def circularArrayLoop(self, nums):
"""
:type nums: List[int]
:rtype: bool
"""
for i in range(len(nums)):
if nums[i] == 0 or nums[i] == len(nums):
nums[i] = 0
continue
start = i
while 0 <= start:
k = start%len(nums)
if nums[k] == 0 or nums[k] == '0':
break
b = start
start += nums[k]
nums[k] = '0'
if start >= len(nums) and nums[start % len(nums)] == '0':
return True
else:
nums = [int(j) for j in nums]
return False
解法2
class Solution(object):
def circularArrayLoop(self, nums):
"""
:type nums: List[int]
:rtype: bool
"""
for i in range(len(nums)):
if nums[i] == 0 or nums[i] == len(nums):
nums[i] = 0
continue
start = i
now = set([])
while 0 <= start:
k = start%len(nums)
now.add(k)
if nums[k] == 0 or nums[k] == '0':
break
b = start
start += nums[k]
nums[k] = '0'
if start >= len(nums) and nums[start % len(nums)] == '0':
return True
else:
for j in now:
nums[j] = int(nums[j])
return False