Leetcode每日一题 —— 1306. 跳跃游戏 III

力扣 LeetCode 1306. 跳跃游戏 III - 力扣(LeetCode) 1306. 跳跃游戏 III - 这里有一个非负整数数组 arr,你最开始位于该数组的起始下标 start 处。当你位于下标 i 处时,你可以跳到 i + arr[i] 或者 i - arr[i]。 请你判断自己是否...
Leetcode每日一题 —— 1306. 跳跃游戏 III
Leetcode每日一题 —— 1306. 跳跃游戏 III
力扣 LeetCode

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 在无向图角度看来能跳到 04 下标,但是 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 位参与者

阅读完整话题

来源: LinuxDo 最新话题查看原文