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;
}
};