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
}