1765. 地图中的最高点

81 阅读1分钟

题目:
给你一个大小为 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) 的高度。如果有多种解法,请返回 任意一个 。

算法:
方法一:多源BFS
从水域开始BFS,遍历到的位置高度+1,已经遍历过的位置则跳过。这样可以保证陆地高度最高。每个陆地的高度由它距离最近的水域的距离决定。

func highestPeak(isWater [][]int) [][]int {
    n := len(isWater)
    m := len(isWater[0])

    queue := make([][]int, 0)
    for i := 0 ; i < n; i ++ {
        for j := 0; j < m; j ++ {
            if isWater[i][j] == 0 {
                isWater[i][j] = -1
            } else {
                queue = append(queue, []int{i, j})
                isWater[i][j] = 0
            }
        }
    }
    dircts := [][]int{[]int{-1, 0},[]int{1, 0},[]int{0, -1},[]int{0, 1}}
    for len(queue) != 0 {
        item := queue[0]
        queue = queue[1:]
        for _, dirt := range dircts {
            x, y := item[0] + dirt[0], item[1] + dirt[1]
            if 0 <= x && x < n && 0 <= y && y < m {
                //bfs遍历过了
                if isWater[x][y] != -1 {
                    continue
                }
                isWater[x][y] = isWater[item[0]][item[1]] + 1
                queue = append(queue, []int{x, y})
            }
        }
    }
    return isWater
}