[LeetCode] 1162. 地图分析

题目描述:

你现在手里有一份大小为 n x n 的 网格 grid,上面的每个 单元格 都用 0 和 1 标记好了。其中 0 代表海洋,1 代表陆地。

请你找出一个海洋单元格,这个海洋单元格到离它最近的陆地单元格的距离是最大的,并返回该距离。如果网格上只有陆地或者海洋,请返回 -1。

我们这里说的距离是「曼哈顿距离」( Manhattan Distance):(x0, y0) 和 (x1, y1) 这两个单元格之间的距离是 |x0 - x1| + |y0 - y1| 。

示例 1:

复制代码
输入:grid = [[1,0,1],[0,0,0],[1,0,1]]
输出:2
解释: 
海洋单元格 (1, 1) 和所有陆地单元格之间的距离都达到最大,最大距离为 2。

示例 2:

复制代码
输入:grid = [[1,0,0],[0,0,0],[0,0,0]]
输出:4
解释: 
海洋单元格 (2, 2) 和所有陆地单元格之间的距离都达到最大,最大距离为 4。

提示:

  • n == grid.length
  • n == grid[i].length
  • 1 <= n <= 100
  • grid[i][j] 不是 0 就是 1

题目链接:

. - 力扣(LeetCode)

解题主要思路:

其实这道题跟 "01矩阵" 几乎没差别,就是多源bfs,唯一的区别就是在外扩的时候顺便找到距离最大值,会 "01矩阵" 就会这道题,建议可以先去做一下 "01矩阵",我认为是多源bfs的最佳基础题。

01矩阵链接:

LeetCode 542. 01矩阵-CSDN博客

解题代码:;

cpp 复制代码
class Solution {
public:
    int dx[4]{0, 0, 1, -1};
    int dy[4]{1, -1, 0, 0};
    int maxDistance(vector<vector<int>>& grid) {
        int m = grid.size(), n = grid[0].size();
        vector<vector<int>> ret(m, vector(n, -1));
        queue<pair<int, int>> que;
        // 将所有陆地入队列
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (grid[i][j]) { 
                    ret[i][j] = 0;
                    que.push(make_pair(i, j));
                }
            }
        }
        int max_dis = -1;
        // 一层一层往外扩
        while (que.size()) {
            auto [a, b] = que.front();
            que.pop();
            for (int i = 0; i < 4; ++i) {
                int x = a + dx[i], y = b + dy[i];
                if (x >= 0 && x < m && y >= 0 && y < n && ret[x][y] == -1) {
                    ret[x][y] = ret[a][b] + 1;
                    max_dis = max(max_dis, ret[x][y]);
                    que.push(make_pair(x, y));
                }
            }
        }
        return max_dis;
    }
};
相关推荐
圣保罗的大教堂14 小时前
leetcode 3756. 连接非零数字并乘以其数字和 II 中等
leetcode
沫璃染墨14 小时前
《从零入门Linux系统篇(五十七):线程篇·十——生产者消费者模型进阶:从环形缓冲区到POSIX信号量》
linux·运维·服务器·开发语言·c++·系统架构·信号处理
wuminyu14 小时前
LockStack在虚拟线程Mount和Unmount拷贝过程剖析
java·linux·c语言·jvm·c++
深念Y14 小时前
rime-雾凇拼音-配置记录
linux·junit·软件·拼音·kde
知识分享小能手15 小时前
C++ 学习教程,从入门到精通,string类和标准模板库 — 完整知识点详解(16)
开发语言·c++·学习
无忧.芙桃15 小时前
位图妙用:512MB 实现 40 亿整数的存在性查询
c语言·c++·面试·哈希算法
星夜夏空9915 小时前
网络编程(5)—— Reactor实现(v3)
服务器·网络·php
ShineWinsu15 小时前
对于Redis:Steam、Geospatial、Hyperloglog、Bitmap、Bitfield类型的解析
数据库·c++·redis·分布式·缓存·面试·zset
朝朝辞暮i15 小时前
C++ 第 31C 课:Subscriber 到底是什么
开发语言·c++·算法
程序猿老A16 小时前
从入门型到企业型:云服务器开放共享型到独享型规格升级
运维·服务器