这里有一个非负整数数组 arr,你最开始位于该数组的起始下标 start 处。当你位于下标 i 处时,你可以跳到 i + arr[i] 或者 i - arr[i]。
请你判断自己是否能够跳到对应元素值为 0 的 任一 下标处。
注意,不管是什么情况下,你都无法跳到数组之外。
1. 思路
1.1 广度优先遍历(BFS)
1.2 深度优先遍历
将给定的start当作树的根节点,将start+arr[start]和start-arr[start]当作树的左右子树,即可构造一个深度优先遍历模型。
2. 代码
2.1 bfs
bfs总是需要队列,在这个题中还需要标记是否访问过。
class Solution:
def canReach(self, arr: List[int], start: int) -> bool:
if arr == []:return False
N = len(arr)
visited = {start}
queue = [start]
while queue:
if arr[queue[0]] == 0:return True
for v in [queue[0] + arr[queue[0]],queue[0] - arr[queue[0]]]:
if 0<=v<N and v not in visited:
if arr[v] == 0:
return True
queue.append(v)
visited.add(v)
queue.pop(0)
return False
2.2 dfs
dfs说白了就是递归
class Solution:
def canReach(self, arr: List[int], start: int) -> bool:
N = len(arr)
def dfs(arr,start,step):
if start < 0 or start >= N:return False
if step == N:return False
if arr[start] == 0:return True
return dfs(arr,start + arr[start],step + 1) or dfs(arr,start - arr[start],step + 1)
return dfs(arr,start,0)