leetcode每日一题——地图中的最高点(路径更新权值问题)

Posted C+++++++++++++++++++

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode每日一题——地图中的最高点(路径更新权值问题)相关的知识,希望对你有一定的参考价值。

文章目录

题目

题目链接

解题思路

两种解题思路,都是根据题目的意思更新路径信息即可:

  1. bfs思路:由于相邻的两个格子必须高度差为1,而水域必须高度为0,所以,直接以水域为bfs源点,进行bfs把整个区域的值给更新就行了。这是bfs思路。
  2. dp思路:由于dp都依赖上一次更新的结果,而我们一般就是从左到右的遍历更新,而这题是和四个位置相关,所以,我们分为:从上到下从左到右更新,可以把依赖上和左的答案给更新,从下到上,从右到左更新,可以把依赖下和右的结果给更新完。

解题代码

BFS代码

class Solution 
public:
    const int dx[4]=-1,1,0,0;
    const int dy[4]=0,0,-1,1;
    int n,m;
    bool isValid(int x,int y)
        return x<n&&x>=0&&y<m&&y>=0;
    
   const  int maxn = 1e3+5;
    vector<vector<int>> highestPeak(vector<vector<int>>& isWater) 
        n = isWater.size();
        m = isWater[0].size();
        bool visit[maxn][maxn];
        memset(visit,0,sizeof(visit));
        queue<pair<int,int>>Q;
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
                if(isWater[i][j])
                    visit[i][j] = 1;
                    isWater[i][j] = 0;
                    Q.push(i,j);
                
            
        
        int step = 1;
        while(!Q.empty())
            for(int i=Q.size();i>0;i--)
                auto[x,y] = Q.front();Q.pop();
                for(int k=0;k<4;k++)
                    int nx = x+dx[k];
                    int ny = y+dy[k];
                    if(isValid(nx,ny)&&!visit[nx][ny])
                        visit[nx][ny] = 1;
                        isWater[nx][ny] = step;
                        Q.push(nx,ny);
                    
                
             
            step++;
        
        return isWater;
    
;

dp代码

class Solution 
public:
    vector<vector<int>> highestPeak(vector<vector<int>>& isWater) 
        int n = isWater.size();
        int m = isWater[0].size();
        vector<vector<int>> dp(n, vector<int>(m, 1e9+7));
        for(int i=0; i<n; i++)             //从上到下从左到右
            for(int j=0; j<m; j++) 
                if(isWater[i][j]) dp[i][j] = 0;
                else 
                    if(i > 0) dp[i][j] = min(dp[i][j], dp[i-1][j]+1);
                    if(j > 0) dp[i][j] = min(dp[i][j], dp[i][j-1]+1);
                
            
        
        for(int i=n-1; i>=0; i--)          //从下到上从右到左
            for(int j=m-1; j>=0; j--) 
                if(isWater[i][j]) dp[i][j] = 0;
                else 
                    if(i < n-1) dp[i][j] = min(dp[i][j], dp[i+1][j]+1);
                    if(j < m-1) dp[i][j] = min(dp[i][j], dp[i][j+1]+1);
                
            
        
        return dp;
    
;

以上是关于leetcode每日一题——地图中的最高点(路径更新权值问题)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode每日一题2020.6.21 124. 二叉树中的最大路径和

leetcode 每日一题 64. 最小路径和

leetcode 每日一题 64. 最小路径和

LeetCode每日一题2020.7.06 63. 不同路径 II

leetcode 每日一题 63. 不同路径 II

leetcode 每日一题 63. 不同路径 II