Leetcode每日一题练习 ------ 1765. 地图中的最高点

Leetcode 每日一题练习继续讨论:

1765. 地图中的最高点
1765. Map of Highest Peak

题解

本题要读懂题面,注意要求相邻两个格子的差值最多为1,而水面的高度必须为0,则以水面为基准,水面的相邻格子高度必定为0或者1,为了最终能得到尽可能大的最大值,必然要选择让水面相邻格子的高度增加即均为1,对于得到的全部高度为1的的格子,同样对这些格子的相邻格子由于题面限制,这些格子的相邻格子的高度必定为2,以此迭代直到全部格子都被填满,最后被填充的格子的高度即为得到的最大高度。

则此过程可以使用bfs来解决,先将所有的水面位置放入队列,再依次执行bfs,将所有水面的相邻位置高度设为1并放入队列,继续对高度为1的格子执行bfs,以此类推。

代码

class Solution {
public:
    vector<vector<int>> highestPeak(vector<vector<int>>& isWater) {
        int m = isWater.size();
        int n = isWater[0].size();
        
        vector<vector<int>> height(m, vector<int>(n, -1));
        queue<pair<int, int>> q;
        
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (isWater[i][j] == 1) {
                    height[i][j] = 0;
                    q.push({i, j});
                }
            }
        }
        
        vector<int> dx = {-1, 0, 1, 0};
        vector<int> dy = {0, 1, 0, -1};
        
        // BFS过程
        while (!q.empty()) {
            int x = q.front().first;
            int y = q.front().second;
            q.pop();
            
            for (int i = 0; i < 4; i++) {
                int nx = x + dx[i];
                int ny = y + dy[i];
                
                if (nx >= 0 && nx < m && ny >= 0 && ny < n && height[nx][ny] == -1) {
                    height[nx][ny] = height[x][y] + 1;
                    q.push({nx, ny});
                }
            }
        }
        
        return height;
    }
};
2 个赞

来了,刷题佬

来了,刷题佬!