地址 https://leetcode-cn.com/problems/jump-game-iii/submissions/
题目描述
这里有一个非负整数数组 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
算法1
常规dfs题目 额外添加了一个数组记录该点是否已经访问过 避免重复访问
class Solution { public: vector<int> vis; bool dfs(const vector<int>& arr, int idx) { if (idx >= arr.size() || idx < 0 || vis[idx] == 1) return false; if (arr[idx] == 0) return true; vis[idx] = 1; bool ret1, ret2; int newidx1 = idx + arr[idx]; ret1 = dfs(arr,newidx1); if (ret1 == true) return true; int newidx2 = idx - arr[idx]; ret2 = dfs(arr, newidx2); if (ret2 == true) return true; return false; } bool canReach(vector<int>& arr, int start) { vis.resize(50010); bool ret = dfs(arr, start); return ret; } };
原文地址:https://www.cnblogs.com/itdef/p/12118476.html
时间: 2024-10-08 19:07:42