LeetCode 1765地图中的最高点[BFS] HERODING的LeetCode之路

Posted HERODING23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 1765地图中的最高点[BFS] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。



解题思路:
岛屿系列的经典题目,一眼看就知道用BFS来解决。首先构建高度数组,长宽为整数矩阵的长宽,初始化都是-1,表示未访问,这很重要,因为在之后的更新中,已经访问的就不能更新了,因为肯定受到附近点的束缚无法更新。其次定义队列,存储水域和以及更新的点,因为之后的操作都从水域开始,之后的步骤如下:

  1. 遍历数组,找到所有的水域,更新高度数组(水域为0),并存储到队列中。
  2. 循环访问队列直到空,从队列头部出队,遍历该点附近的四个点,判断是否在范围内且未访问,更新点并放入队列中。
  3. 队列空退出,返回高度数组。

代码如下:

class Solution 
private:
    int direction[4][2] = 1, 0, -1, 0, 0, 1, 0, -1;
public:
    vector<vector<int>> highestPeak(vector<vector<int>>& isWater) 
        int m = isWater.size(), n = isWater[0].size();
        // 高度矩阵初始化,-1为未访问
        vector<vector<int>> ans(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]) 
                    ans[i][j] = 0;
                    q.push(i, j);
                
            
        
        while(!q.empty()) 
            auto& site = q.front();
            for(auto& dir : direction) 
                int x = site.first + dir[0], y = site.second + dir[1];
                // 在范围内且未被访问过
                if(x >= 0 && x < m && y >= 0 && y < n && ans[x][y] == -1) 
                    ans[x][y] = ans[site.first][site.second] + 1;
                    q.push(x, y);
                
            
            // 后pop,否则site不可用
            q.pop();
        
        return ans;
    
;

以上是关于LeetCode 1765地图中的最高点[BFS] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章

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

Leetcode之广度优先搜索(BFS)专题-1162. 地图分析(As Far from Land as Possible)

leetcode 1162. 地图分析(bfs)

LeetCode 463. 岛屿的周长 bfs

LeetCode 310 最小高度数[拓扑排序 BFS] HERODING的LeetCode之路

bfs算法总结