1765. 地图中的最高点
地图中的最高点
题目描述:
给你一个大小为 m x n 的整数矩阵 isWater ,它代表了一个由 陆地 和 水域 单元格组成的地图。
如果 isWater[i][j] == 0 ,格子 (i, j) 是一个 陆地 格子。
如果 isWater[i][j] == 1 ,格子 (i, j) 是一个 水域 格子。
你需要按照如下规则给每个单元格安排高度:
每个格子的高度都必须是非负的。
如果一个格子是是 水域 ,那么它的高度必须为 0 。
任意相邻的格子高度差 至多 为 1 。当两个格子在正东、南、西、北方向上相互紧挨着,就称它们为相邻的格子。(也就是说它们有一条公共边)
找到一种安排高度的方案,使得矩阵中的最高高度值 最大 。
请你返回一个大小为 m x n 的整数矩阵 height ,其中 height[i][j] 是格子 (i, j) 的高度。如果有多种解法,请返回 任意一个 。
示例 1:
输入:isWater = [[0,1],[0,0]]
输出:[[1,0],[2,1]]
解释:上图展示了给各个格子安排的高度。
蓝色格子是水域格,绿色格子是陆地格。
示例 2:
输入:isWater = [[0,0,1],[1,0,0],[0,0,0]]
输出:[[1,1,0],[0,1,1],[1,2,2]]
解释:所有安排方案中,最高可行高度为 2 。
任意安排方案中,只要最高高度为 2 且符合上述规则的,都为可行方案。
提示:
m == isWater.length
n == isWater[i].length
1 <= m, n <= 1000
isWater[i][j] 要么是 0 ,要么是 1 。
至少有 1 个水域格子。
思路:
用bfs,从每个水面开始bfs便利,每便利到一个就比之前加1
代码:
func highestPeak(isWater [][]int) [][]int {
type pair struct {x,y int}
var dirs = []pair{{-1,0}, {1,0}, {0,-1}, {0,1}}
var p []pair
for i := 0; i <len(isWater); i++{
for j:= 0; j<len(isWater[i]); j++{
if isWater[i][j] == 1{
isWater[i][j] = 0
p = append(p, pair{i,j})
}else{
isWater[i][j] = -1
}
}
}
for len(p) != 0{
q := p[0]
p = p[1:]
for _,i := range dirs{
x:= q.x + i.x
y := q.y + i.y
if x>=0 && x<len(isWater) && y >=0 && y<len(isWater[0]) && isWater[x][y] == -1{
isWater[x][y] = isWater[q.x][q.y]+1
p = append(p,pair{x,y})
}
}
}
return isWater
}
代码效率:
执行用时:0 ms, 在所有 Go 提交中击败了100.00%的用户
内存消耗:2.2 MB, 在所有 Go 提交中击败了100.00%的用户
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!