LeetCode-Python-1162. 地图分析

663 篇文章 23 订阅

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

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

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

 

示例 1:

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

示例 2:

输入:[[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

思路:

问最短距离就上BFS。

先找到所有的陆地的坐标,然后BFS往外一圈一圈地找海洋,

统计一下BFS循环的次数就可以得到最远的陆海距离。

class Solution(object):
    def maxDistance(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        from collections import deque
        n = len(grid)
        queue = deque()
        dx = [1, -1, 0, 0]
        dy = [0, 0, 1, -1]
        for i in range(n):
            for j in range(n):
                if grid[i][j] == 1: #先找所有的陆地
                    queue.append((i, j))
        if len(queue) == 0 or len(queue) == n * n: #全为海洋或全为陆地
            return -1
        distance = -1 #为啥是-1呢,因为第一次BFS是所有的陆地,第二次BFS才开始海洋,-1保证在第二次搜索时距离为1
        while queue:
            l = len(queue)
            
            for _ in range(l):
                cur = queue.popleft()
                x0, y0 = cur
                
                for k in range(4):
                    x = x0 + dx[k]
                    y = y0 + dy[k]
                    
                    if 0 <= x < n and 0 <= y < n and grid[x][y] == 0: #找到海洋了
                        grid[x][y] = 1
                        queue.append((x, y))
            distance += 1
        return distance

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值