leetcode每日一题——地图中的最高点
这篇题解讨论了“地图中的最高点”两种常见做法:多源 BFS 和双向 DP,核心是把水域作为高度 0 的锚点向外扩散。题目约束抽象水域格子高度必须为 0。相邻格子的高度差必须为 1。本质上是在网格中求每个点到最近水域的最短距离并作为高度。多源 BFS 思路把所有水域一次性入队,作为 BFS 的第 0 层。按层扩展未访问节…
题目 题目链接 解题思路 两种解题思路,都是根据题目的意思更新路径信息即可: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; } };
正在初始化 WebAssembly 引擎…
首次编译原生模块可能需要数秒
就绪后,页面交互将以接近原生的速度运行