力扣每日一题2022-01-29中等题:地图中的最高点

力扣每日一题2022-01-29中等题:地图中的最高点,第1张

力扣每日一题2022-01-29中等题:地图中的最高点

地图中的最高点

1765.地图中的最高点

题目描述思路

多源BFS

Java实现Python实现


1765.地图中的最高点 题目描述

地图中的最高点


思路 多源BFS

根据题意,要求让矩阵中的最高高度最大,那么就需要最大化每个格子的高度才能实现。因为任意相邻的格子高度至多差1,这意味着每个格子的高度至多比周围的所有相邻格子中的最小高度多1。
另外题目要求水域的高度必须为0,因此水域的高度是已知的,那么就可以从水域出发,推导出其余格子的高度:

首先,计算与水域相邻的格子的高度。这些格子其相邻格子的最小高度即为水域的高度0,所以这些格子高度为1。然后,计算与高度为1的格子相邻的、且未被计算过的格子的高度。这些格子相邻格子最小高度为1,因此这些格子的高度为2。以此类推,计算出所有格子的高度。
所以,上述过程就是从水域出发,执行BFS的过程。因此,记录下所有水域的位置,然后进行BFS,计算出所有陆地格子的高度,即为答案。 Java实现

class Solution {
    int[][] dirs = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
    
    public int[][] highestPeak(int[][] isWater) {
        int m = isWater.length, n = isWater[0].length;
        int[][] ans = new int[m][n];
        for (int i = 0; i < m; ++i) {
            Arrays.fill(ans[i], -1); // -1 表示该格子尚未被访问过
        }
        Queue queue = new ArrayDeque();
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (isWater[i][j] == 1) {
                    ans[i][j] = 0;
                    queue.offer(new int[]{i, j}); // 将所有水域入队
                }
            }
        }
        while (!queue.isEmpty()) {
            int[] p = queue.poll();
            for (int[] dir : dirs) {
                int x = p[0] + dir[0], y = p[1] + dir[1];
                if (0 <= x && x < m && 0 <= y && y < n && ans[x][y] == -1) {
                    ans[x][y] = ans[p[0]][p[1]] + 1;
                    queue.offer(new int[]{x, y});
                }
            }
        }
        return ans;
    }
}
Python实现

class Solution:
    def highestPeak(self, isWater: List[List[int]]) -> List[List[int]]:
        m, n = len(isWater), len(isWater[0])
        ans = [[water - 1 for water in row] for row in isWater]
        q = deque((i, j) for i, row in enumerate(isWater) for j, water in enumerate(row) if water)
        while q:
            i, j = q.popleft()
            for x, y in ((i-1, j), (i+1, j), (i, j-1), (i, j+1)):
                if 0 <= x < m and 0 <= y < n and ans[x][y] == -1:
                    ans[x][y] = ans[i][j] + 1
                    q.append((x, y))
        return ans

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5719697.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-18
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存