【leetcode】1162. As Far from Land as Possible

题目如下:

Given an N x N grid containing only values 0 and 1, where 0 represents water and 1 represents land, find a water cell such that its distance to the nearest land cell is maximized and return the distance.

The distance used in this problem is the Manhattan distance: the distance between two cells (x0, y0)and (x1, y1) is |x0 - x1| + |y0 - y1|.

If no land or water exists in the grid, return -1.

 

Example 1:

Input: [[1,0,1],[0,0,0],[1,0,1]]
Output: 2
Explanation: 
The cell (1, 1) is as far as possible from all the land with distance 2.

Example 2:

Input: [[1,0,0],[0,0,0],[0,0,0]]
Output: 4
Explanation: 
The cell (2, 2) is as far as possible from all the land with distance 4.

 

Note:

  1. 1 <= grid.length == grid[0].length <= 100
  2. grid[i][j] is 0 or 1

解题思路:题目不难,注意用BFS,如果用DFS会超时。

代码如下:

class Solution(object):
    def maxDistance(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        val = [[float('inf')] * len(grid[0]) for _ in grid]
        queue = []

        for i in range(len(grid)):
            for j in range(len(grid[i])):
                if grid[i][j] == 1:
                    queue.append((i, j, 0))

        direction = [(0, 1), (0, -1), (1, 0), (-1, 0)]
        while len(queue) > 0:
            x, y, dis = queue.pop(0)
            for (x1, y1) in direction:
                if x + x1 >= 0 and x + x1 < len(grid) and y + y1 >= 0 \
                        and y + y1 < len(grid[0]) and grid[x + x1][y + y1] == 0 \
                        and val[x + x1][y + y1] > dis + 1:
                    val[x + x1][y + y1] = dis + 1
                    queue.append((x + x1, y + y1, dis + 1))

        res = -1
        for i in range(len(val)):
            for j in range(len(val[i])):
                if val[i][j] != float('inf') and res < val[i][j]:
                    res = val[i][j]

        return res

 

posted @ 2019-08-19 13:36  seyjs  阅读(694)  评论(3编辑  收藏  举报