1162. 地图分析

Wesley13
• 阅读 667

你现在手里有一份大小为 N x N 的『地图』(网格) grid,上面的每个『区域』(单元格)都用 0 和 1 标记好了。其中 0 代表海洋,1 代表陆地,你知道距离陆地区域最远的海洋区域是是哪一个吗?请返回该海洋区域到离它最近的陆地区域的距离。

我们这里说的距离是『曼哈顿距离』( Manhattan Distance):(x0, y0) 和 (x1, y1) 这两个区域之间的距离是 |x0 - x1| + |y0 - y1| 。

如果我们的地图上只有陆地或者海洋,请返回 -1

示例 1:

1162. 地图分析

输入:[[1,0,1],[0,0,0],[1,0,1]]
输出:2
解释: 
海洋区域 (1, 1) 和所有陆地区域之间的距离都达到最大,最大距离为 2。

示例 2:

1162. 地图分析

输入:[[1,0,0],[0,0,0],[0,0,0]]
输出:4
解释: 
海洋区域 (2, 2) 和所有陆地区域之间的距离都达到最大,最大距离为 4。

提示:

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

Solution:

其实这一题跟number of islands很像,都是bfs把0变1的4-way搜索。对于每一个0(water),都存在离它最近的陆地距离,需要找到所有的距离中的最大值。解法就是把陆地放到deque队列中,再逐层搜索,每一次把d=1,d=2,...递增的所有的0都找到并变为1,逐层distance增加,最后返回的就是最大距离。

from collections import deque

class Solution(object):
    def maxDistance(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        
        lands = deque([]) # python的队列是deque
        n, res = len(grid), -1
        for x in range(n):
            for y in range(n):
                if grid[x][y]: # land found
                    lands.append((x, y))
                    
        if len(lands) == 0 or len(lands) == n*n:
            return res
        
        dx, dy = [-1, 1, 0, 0], [0, 0, -1, 1]
        while lands:
            num = len(lands)
            for _ in range(num):
                x0, y0 = lands.popleft() # tuple还能这样用
                for i in range(4): # 4-way bfs search
                    x, y = x0 + dx[i], y0 + dy[i]
                    if 0 <= x < n  and 0 <= y < n  and not grid[x][y]: # water found
                        grid[x][y] = 1 # 很像number of islands
                        lands.append((x, y))
            res += 1
    
        return res
点赞
收藏
评论区
推荐文章
Python进阶者 Python进阶者
3年前
一篇文章带你了解HTML的网页布局结构
大家好,我是IT共享者,人称皮皮。这篇我们来讲讲CSS网页布局。一、网页布局网页布局有很多种方式,一般分为以下几个部分:头部区域、菜单导航区域、内容区域、底部区域。1\.头部区域头部区域位于整个网页的顶部,一般用于设置网页的标题或者网页的logo:例CSS项目(runoob.com)bodymargin:0;/头部样式/.heade
LeeFJ LeeFJ
1年前
Foxnic-Web 代码生成 (8) —— 配置列表页
列表页面主要包含了顶部的搜索区域和表格区域,搜索区域有点类似表单,配置上可能存在相似之处。本篇我们就来了解一下,在代码生成时的列表页呈现方面,我们可以做点啥。
Karen110 Karen110
3年前
Python爬取所有人位置信息,制作任意区域人流量显示图
最近偶然看到了腾讯的大数据星云图,非常漂亮,如下图:这些数据代表使用腾讯定位服务的用户实际地理位置,例如微信、QQ、腾讯地图等,所以使用量还是表达的,此图可以间接显示人流量情况该网站还可以查看区域热力图:但是只有个别区域于是我萌生一个想法,用python任意区域人员流量图经过不懈努力,没想到还真给实现了,下面带大家一起学习一下这一过程:一、首先是数据获取
Stella981 Stella981
3年前
Secondary ,Supplementary alignment 和bwa mem的
1.supplementaryalignmentsupplementaryalignment是指一条read的一部分和参考区域1比对成功,另一部分和参考区域2比对成功,参考区域1和参考区域2没有交集(或很少),那么一条read就会产生两条sam文件,将其中的一条sam文件作为representalignment,而另一条作为supplement
Wesley13 Wesley13
3年前
ABB安全区域和中断一起连用案例解析
MODULEXXXX  !定义临时全局区域数据  VARwztemporaryconveyor;  !定义全局区域形状数据  VARshapedatavolume;  !定义中断识别号  VARintnumempty;  !定义全局区域形状设定数据位置点1和点2  persposcorner1
Wesley13 Wesley13
3年前
Java中当前对象引用
题:计算机画图时,有点的概念,每个点由它的横坐标x和纵坐标y描述。写一个类。求两个点之间的曼哈顿距离横向距离纵向距离例如,一个点(0,0)和另一个点(1,1)的曼哈顿距离为2packagetest;publicclassPoint{
Stella981 Stella981
3年前
JVM 运行时内存分配
Java内存分配在解释这个问题之前,我想简单的记录一下Java虚拟机对内存的分配管理。!(https://static.oschina.net/uploads/space/2017/0207/160723_gnLQ_1054538.jpg)简单的说,Java运行时内存区域,就由上面几部分构成。青绿色标记的,是每个线程私有的内存区域,其
Stella981 Stella981
3年前
JVM探秘3:内存溢出
在Java虚拟机内存区域中,除了程序计数器外,其他几个内存区域都可能会发生OutOfMemoryError,这次通过一些代码来验证虚拟机各个内存区域存储的内容。在实际工作中遇到内存溢出异常时,需要做到能根据异常信息快速判断是哪个内存区域的溢出,知道什么样的代码会导致这些区域内存溢出,并且知道出现内存溢出后如何处理。Java堆溢出Jav
Stella981 Stella981
3年前
Leetcode 363.矩形区域不超过k的最大数值和
矩形区域不超过k的最大数值和给定一个非空二维矩阵 _matrix_和一个整数_k_,找到这个矩阵内部不大于_k_的最大矩形和。示例:输入:matrix\\1,0,1\,\0,2,3\\,k2输出:2解释: 矩形区域 \\0,1\,
Stella981 Stella981
3年前
Linux下的lds链接脚本简介(三)
八、内存区域命令在默认情形下,连接器可以为section在程序地址空间内分配任意位置的存储区域。并通过输出section描述的\REGION属性显示地将该输出section限定于在程序地址空间内的某块存储区域,当存储区域大小不能满足要求时,连接器会报告该错误。你也可以用MEMORY命令让在SECTIONS命令内\未\引