1306. 跳跃游戏 III - 力扣(LeetCode)
1306. 跳跃游戏 III - 这里有一个非负整数数组 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 -> 下标...
还有第三关 ( °ヮ° )
思路
每个下标位置 i 处可以跳到 i+arr[i] 或者 i-arr[i] 两个点,我们从 start 下标出发。
这题显然是在考察有向可达性(不是无向的,不能用并查集),可以用 BFS 或者 DFS 解决。这里咱就写成 BFS 了,从 start 开始,每到一个下标都将其可达的点加入队列,直至出队下标对应的元素为 0,则满足题目的跳跃条件。
- 为什么是有向图?比如
arr = [0, 2, 2, 2, 1], start = 4,下标 3 在无向图角度看来能跳到0和4下标,但是4下标实际上到达不了下标3。
代码
class Solution {
public:
bool canReach(vector<int>& arr, int start) {
// 只要能到达 0 即可,这题其实就是判断有向图连通性
// 从 start 开始用 BFS
queue<int> q;
vector<bool> visited(arr.size(),false);
q.emplace(start);
while(!q.empty()){
int idx=q.front();
q.pop();
if(arr[idx]==0){
return true;
}
int prev=idx-arr[idx];
int next=idx+arr[idx];
if(prev>=0&&!visited[prev]){
visited[prev]=true;
q.emplace(prev);
}
if(next<arr.size()&&!visited[next]){
visited[next]=true;
q.emplace(next);
}
}
return false;
}
};
错误解法(用了并查集) (点击了解更多详细信息)
2 个帖子 - 2 位参与者