题目:
这里有一个非负整数数组 arr,你最开始位于该数组的起始下标 start 处。当你位于下标 i 处时,你可以跳到 i + arr[i] 或者 i - arr[i]。
请你判断自己是否能够跳到对应元素值为 0 的 任一 下标处。
注意,不管是什么情况下,你都无法跳到数组之外。
思路 :
代码:
java
class Solution {
public boolean canReach(int[] arr, int start) {
boolean[] visited = new boolean[arr.length];
return dfs(arr, start, visited);
}
private boolean dfs(int[] arr, int curPos, boolean[] visited) {
if (curPos < 0 || curPos >= arr.length || visited[curPos]) {
return false;
}
if (arr[curPos] == 0) {
return true;
}
visited[curPos] = true;
return dfs(arr, curPos - arr[curPos], visited) || dfs(arr, curPos + arr[curPos], visited);
}
}
性能:
时间复杂度o(n)每个节点最多被访问一次
空间复杂度o(n)visit数组 o(n);递归深度最多 o(n)