1345. 跳跃游戏 IV bfs

给你一个整数数组 arr ,你一开始在数组的第一个元素处(下标为 0)。

每一步,你可以从下标 i 跳到下标:

i + 1 满足:i + 1 < arr.length
i - 1 满足:i - 1 >= 0
j 满足:arr[i] == arr[j] 且 i != j
请你返回到达数组最后一个元素的下标处所需的 最少操作次数 。

注意:任何时候你都不能跳到数组外面。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/jump-game-iv
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  • 。在第一次访问到这个子图中的某个节点时,即会将这个子图的所有其他未在队列中的节点都放入队列。在第二次访问到这个子图中的节点时,就不需要去考虑这个子图中的其他节点了,因为所有其他节点都已经在队列中或者已经被访问过了。

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/jump-game-iv/solution/tiao-yue-you-xi-iv-by-leetcode-solution-zsix/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

class Solution {
public:
    int minJumps(vector<int>& arr) {
        int n = arr.size();
        vector <bool> vis(n + 1, false);
        int ans = 0;

        map <int, set<int>> G;
        for (int i = 0; i < n; i++) {
            G[arr[i]].insert(i);
        }

        queue <int> q;
        q.push(n - 1);
        vis[n - 1] = false;
        while (!q.empty()) {
            int size = q.size();
            while (size--) {
                int cur = q.front(); q.pop();
                if (cur == 0) {
                    return ans;
                }
                if (cur + 1 < n && ! vis[cur + 1]) {
                    q.push(cur + 1);
                    vis[cur + 1] = true;
                }
                if (cur - 1 >= 0 && ! vis[cur - 1]) {
                    q.push(cur - 1);
                    vis[cur - 1] = true;
                }
                for (auto x : G[arr[cur]]) {
                    if (!vis[x]) {
                        vis[x] = true;
                        q.push(x);
                    }
                }
                G[arr[cur]].clear();
            }
            ans++;
        }

        return ans;
    }
};
上一篇:javascript – 如何使用Multer文件过大时向客户端发送响应


下一篇:Android ViewPager+轮播图,android开发应用实战详解