[LeetCode] 1162. 地图分析

题目描述:

你现在手里有一份大小为 n x n 的 网格 grid,上面的每个 单元格 都用 01 标记好了。其中 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;
    }
};
相关推荐
黎阳之光3 小时前
黎阳之光实时三维重构:重构智慧铁路全新管控范式
大数据·人工智能·物联网·算法·数字孪生
weixin_400005603 小时前
Vision-Language-Action:LMDrive项目架构与核心算法组件
人工智能·深度学习·算法·机器学习·架构·自动驾驶
mingo_敏3 小时前
强化学习(RL):原理、算法、RLHF落地全解析
人工智能·算法·机器学习
剑挑星河月3 小时前
234. 回文链表
java·数据结构·算法·leetcode·链表
zh_xuan4 小时前
c++ std::Any 用法
开发语言·c++·any
骑士雄师4 小时前
大模型:MessagesPlaceholder 是什么?
服务器·windows·microsoft
say_fall4 小时前
【Git 精品详解】企业规范:企业级开发模型、Git Flow、发版流程规范、Code Owner 制度、事故应急回滚
大数据·linux·服务器·git·学习·elasticsearch
Helen_cai4 小时前
OpenHarmony CustomDialog 自定义弹窗全场景开发与 API23 + 适配优化
运维·服务器·microsoft
一杯奶茶¥4 小时前
Ubuntu系统镜像各个版本下载Ubuntu镜像合集资源Linux系统镜像乌班图Linux系统镜像
linux·运维·ubuntu·镜像·;inux镜像·ubuntu镜像
运维行者_13 小时前
企业无线网络监控的挑战与智能化演进趋势
大数据·运维·服务器·网络·数据库