1162. As Far from Land as Possible ⭐

Medium

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. If no land or water exists in the grid, return -1.

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|.

Example 1:

Input: grid = [[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: grid = [[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.

Constraints:

  • n == grid.length

  • n == grid[i].length

  • 1 <= n <= 100

  • grid[i][j] is 0 or 1

解題

func maxDistance(grid [][]int) int {
    res := 0
    for i:=0; i<len(grid); i++ {
    	for j:=0; j<len(grid[0]); j++ {
	    if grid[i][j] == 1 { continue }
	    grid[i][j] = 201

	    if i > 0 {
		grid[i][j] = min(grid[i][j], grid[i - 1][j] + 1)
	    }
            if j > 0 {
            	grid[i][j] = min(grid[i][j], grid[i][j - 1] + 1)
            }
    	}
    }

    for i:=len(grid)-1; i>=0;i-- {
    	for j:=len(grid)-1; j>=0; j-- {
    	    if grid[i][j] == 1 { continue }

    	    if i < len(grid) - 1 {
    		grid[i][j] = min(grid[i][j], grid[i + 1][j] + 1)
    	    }
            if j < len(grid) - 1 {
            	grid[i][j] = min(grid[i][j], grid[i][j + 1] + 1)
            } 
            res = max(res, grid[i][j])
    	}
    }
    

    if res == 201 { return -1 }

    return res - 1
}

func min(a, b int) int {
	if a < b { return a }
	return b
}

func max(a, b int) int {
	if a > b { return a }
	return b 
}

Last updated