zl程序教程

您现在的位置是:首页 >  Java

当前栏目

力扣1765. 地图中的最高点(#Day23)

2023-02-18 16:23:56 时间

力扣1765. 地图中的最高点

拿到岛屿问题一般的解决方案是BFS和DFS即广度优先搜索和深度优先搜索,对于本题,更适用于使用BFS广度优先算法。

解题思路如下:首先将isWater初始化为-1表示陆地,然后找到所有初始的水域节点并使用队列记录水域节点的坐标,用0表示水域,初始化后的状态见下图状态2。

然后对所有水域节点向外扩散进行BFS,每向外扩散一圈,高度加1。由于不能重复修改某个点位置的高度,所以需要判断如果当前高度为-1,即没有进行过高度赋值时进行高度的增加。

from collections import deque
from typing import List


def highestPeak(isWater: List[List[int]]) -> List[List[int]]:
    m, n = len(isWater), len(isWater[0])
    # 初始化高度-1为陆地,0为水域
    res = [[-1 for water in row] for row in isWater]
    q = deque()
    for i, row in enumerate(isWater):
        for j, water in enumerate(row):
            if water == 1:
                q.append((i, j))
                res[i][j] = 0
    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 res[x][y] == -1:  # 如果没有越界,陆地也没有被更新过则高度加1
                res[x][y] = res[i][j] + 1
                q.append((x, y))
    return res


isWater = [[0, 0, 1], [1, 0, 0], [0, 0, 0]]
print(highestPeak(isWater))  # [[1, 1, 0], [0, 1, 1], [1, 2, 2]]

END