0
点赞
收藏
分享

微信扫一扫

[bfs]leetcode1345:跳跃游戏 IV(hard)

夹胡碰 2022-01-21 阅读 53

题目:
在这里插入图片描述
在这里插入图片描述


思路:


代码如下:

using PII = pair<int,int>;

class Solution {
public:
    // 思路:边权为1的无向图求起点到终点的最短路问题,使用bfs搜索即可
    int minJumps(vector<int>& nums) {
        // 1. 完成初始化工作:record记录相同的值所有下标集合;visited用来标记顶点的下标是否访问过
        unordered_map<int,vector<int>> record;
        unordered_set<int> visited;
        int n=nums.size();
        for(int i=0;i<n;++i){
            record[nums[i]].push_back(i);
        }
        // 2. 开始bfs以及bfs的初始化工作:q用来存放<顶点下标,步数>
        queue<PII> q;
        q.push({0,0});
        visited.insert(0);
        while(q.size()){
            auto [idx,step]=q.front();q.pop();
            // 到达终点,返回步数
            if(idx==n-1)return step;
            int val=nums[idx];
            // 避免相同值构成的稠密图多次访问造成超时现象,则第一次访问相同值的顶点时,则把它的所有邻接点加入队列
            if(record.count(val)){
                for(int i:record[val]){
                    // 若下标i未被访问,则加入队列,并打标记
                    if(!visited.count(i)){
                        q.push({i,step+1});
                        visited.insert(i);
                    }
                }
                // 避免再次访问这个稠密图的其他顶点,直接把该顶点构成的子图删掉
                record.erase(val);
            }
            // 扩展idx-1,idx+1这两个邻接点
            if(idx-1>=0&&!visited.count(idx-1)){
                q.push({idx-1,step+1});
                visited.insert(idx-1);
            }
            if(idx+1<n&&!visited.count(idx+1)){
                q.push({idx+1,step+1});
                visited.insert(idx+1);
            }
        }
        return 0;
    }
};
举报

相关推荐

0 条评论