(nice!!!)(LeetCode 每日一题)3342. 到达最后一个房间的最少时(Dijkstra 最短路)

题目:3342. 到达最后一个房间的最少时间 II

(nice!!!)(LeetCode 每日一题)3342. 到达最后一个房间的最少时(Dijkstra 最短路)_第1张图片
(nice!!!)(LeetCode 每日一题)3342. 到达最后一个房间的最少时(Dijkstra 最短路)_第2张图片
思路:位置下标可以判断出下次移动所需的额外时间,(i+j)%2+1;
用优先队列来记录每个位置和所花的时间,同时用数组dis来维护到每个位置的最短时间。然后就是广度优先搜索了,时间复杂度0(nm)。

C++版本:

class Solution {
public:
    int fx[4]={0,0,-1,1};
    int fy[4]={1,-1,0,0};
    int minTimeToReach(vector<vector<int>>& moveTime) {
        int n=moveTime.size(),m=moveTime[0].size();
        vector<vector<int>> dis(n,vector<int>(m,INT_MAX));
        dis[0][0]=0;
        priority_queue<pair<int,pair<int,int>>,vector<pair<int,pair<int,int>>>,greater<>> qu;
        qu.push({0,{0,0}});
        while(qu.size()){
            pair<int,pair<int,int>> tmp=qu.top();
            qu.pop();
            int d=tmp.first,x=tmp.second.first,y=tmp.second.second;
            if(x==n-1&&y==m-1){
                return d;
            }
            for(int k=0;k<4;k++){
                int xx=x+fx[k],yy=y+fy[k];
                if(xx<0||xx>=n||yy<0||yy>=m) continue;
                int d2=max(d,moveTime[xx][yy])+(x+y)%2+1;
                if(d2<dis[xx][yy]){
                    dis[xx][yy]=d2;
                    qu.push({d2,{xx,yy}});
                }
            }
        }
        return 0;
    }
};

你可能感兴趣的:(LeetCode,leetcode,算法,职场和发展,c++)