這裏有一個非負整數數組 arr,你最開始位於該數組的起始下標 start 處。當你位於下標 i 處時,你可以跳到 i + arr[i] 或者 i - arr[i]。
請你判斷自己是否能夠跳到對應元素值爲 0 的 任意 下標處。
注意,不管是什麼情況下,你都無法跳到數組之外。
示例 1:
輸入:arr = [4,2,3,0,3,1,2], start = 5
輸出:true
解釋:
到達值爲 0 的下標 3 有以下可能方案:
下標 5 -> 下標 4 -> 下標 1 -> 下標 3
下標 5 -> 下標 6 -> 下標 4 -> 下標 1 -> 下標 3
示例 2:
輸入:arr = [4,2,3,0,3,1,2], start = 0
輸出:true
解釋:
到達值爲 0 的下標 3 有以下可能方案:
下標 0 -> 下標 4 -> 下標 1 -> 下標 3
示例 3:
輸入:arr = [3,0,2,1,2], start = 2
輸出:false
解釋:無法到達值爲 0 的下標 1 處。
提示:
1 <= arr.length <= 5 * 10^4
0 <= arr[i] < arr.length
0 <= start < arr.length
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/jump-game-iii
解題思路:深度優先搜索,用遞歸,用數據標記該位置是否執行過
代碼:
class Solution {
int length;
int[] isTrue;
int[] arrQ;
public boolean canReach(int[] arr, int start) {
length = arr.length;
isTrue = new int[length];
arrQ = arr;
return dfs(start);
}
public boolean dfs(int start) {
if(start < 0 || start >= length){
return false;
}
if(arrQ[start]==0){
return true;
}
if(isTrue[start]==1){
return false;
}else{
isTrue[start]=1;
return dfs(start+arrQ[start])||dfs(start-arrQ[start]);
}
}
}
結果: