leetcode每日一题——地图中的最高点(路径更新权值问题)
Posted C+++++++++++++++++++
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode每日一题——地图中的最高点(路径更新权值问题)相关的知识,希望对你有一定的参考价值。
文章目录
题目
解题思路
两种解题思路,都是根据题目的意思更新路径信息即可:
- bfs思路:由于相邻的两个格子必须高度差为1,而水域必须高度为0,所以,直接以水域为bfs源点,进行bfs把整个区域的值给更新就行了。这是bfs思路。
- 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. 二叉树中的最大路径和