解题思路
DFS: 从起点开始用隐形递归栈深度优先搜索并且标记已经访问过的节点,如果任何一条路径遇到0就返回true,否则如果所有路径都没有0,返回false。
BFS: 从起点开始用队列宽度优先搜索(出度为2, 即cur + arr[cur], cur - arr[cur])并且标记已经访问过的节点,如果任何一条路径遇到0就返回true,否则如果所有路径都没有0,返回false。
代码
class Solution {//跳跃游戏3
vector<int> map;
public:
bool canReach(vector<int>& arr, int start) {//深度优先DFS
map.resize(arr.size(), -1);
return jump(arr, start);
}
bool jump(vector<int>& arr, int start) {
if (start < 0 || start >= arr.size())return false;
if (!arr[start])return true;
if (map[start] >= 0)return false;
map[start]++;
bool res1 = jump(arr, start + arr[start]);
bool res2 = jump(arr, start - arr[start]);
return res1 || res2;
}
};
bool canReach(vector<int>& arr, int start) {//广度优先BFS
vector<int> map(arr.size(), -1);
queue<int> q{ {start} };
while (!q.empty()) {
int idx = q.front();
q.pop();
if (idx < 0 || idx >= arr.size() || map[idx] >= 0) {
continue;
}
if (arr[idx] == 0)return true;
map[idx]++;
q.push(idx + arr[idx]);
q.push(idx - arr[idx]);
}
return false;
}