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 协议 ,转载请注明出处!