LeetCode 1306. 跳跃游戏 III
题目说明
这里有一个非负整数数组 arr,你最开始位于该数组的起始下标 start 处。当你位于下标 i 处时,你可以跳到 i + arr[i] 或者 i - arr[i]。
请你判断自己是否能够跳到对应元素值为 0 的任一下标处。
注意,不管是什么情况下,你都无法跳到数组之外。
来源:力扣(LeetCode)
题目链接
方法一:带辅助数组的dfs
只要找到一个为0的值就可以,所以可以采用dfs,然后利用一个辅助数组visited记录某个索引值是否被访问。
递归终止条件即 arr[index] == 0,不满足终止条件则分别向左和向右继续递归。
class Solution {
public boolean canReach(int[] arr, int start) {
int[] visited = new int[arr.length];
return backtrack(arr, visited, start);
}
private boolean backtrack(int[] arr, int[] visited, int index){
if(arr[index] == 0){
return true;
}
Boolean res = false;
int left = index - arr[index];
int right = index + arr[index];
visited[index] = 1;
if(left >= 0 && visited[left] == 0){
res = res || backtrack(arr, visited, left);
}
if(right < arr.length && visited[right] == 0){
res = res || backtrack(arr, visited, right);
}
return res;
}
}
方法二:不带辅助数组的dfs
看了评论区一位老哥的答案,发现方法一可以被优化。
因为arr是非负整数数组,所以可以直接将访问过的索引值置-1,节省掉了辅助数组的空间。
class Solution {
public boolean canReach(int[] arr, int start) {
return dfs(arr, start);
}
private boolean dfs(int[] arr, int st) {
if (st < 0 || st >= arr.length || arr[st] == -1)
return false;
int step = arr[st];
arr[st] = -1;
return step == 0 || dfs(arr, st + step) || dfs(arr, st - step);
}
}