返回

掌握“力扣一日一练”:27. 保持城市天际线

前端

在这个二维数组的棋盘世界里,拔地而起的建筑物勾勒出城市天际线的轮廓。作为城市规划师,我们肩负着维护天际线完整性的重任,同时也要让城市在云端更上一层楼。

解码挑战

给定一个二维数组 grid,其中 grid[i][j] 表示特定位置的建筑物高度。我们的任务是通过调整建筑物高度,确保从四个方向(上、下、左、右)观察到的天际线与原始天际线保持一致。

解决方案架构

解决这一难题的策略是逐行逐列地扫描数组,并为每个位置确定合适的高度调整。关键步骤如下:

  1. 行扫描: 从左到右遍历每一行。对于每个位置,我们记录左边最高建筑物的高度。
  2. 列扫描: 从上到下遍历每一列。对于每个位置,我们记录上边最高建筑物的高度。
  3. 高度调整: 结合行扫描和列扫描得到的信息,我们计算出每个位置所需的最小高度调整,以确保天际线一致。
  4. 更新高度: 根据计算出的高度调整,我们更新 grid 中相应位置的建筑物高度。

优化关键

优化算法的性能至关重要:

  • 空间优化: 利用辅助数组来存储每一行的最高建筑物高度和每一列的最高建筑物高度,避免重复计算。
  • 时间优化: 通过分治法将数组划分为较小的子数组,并行执行行扫描和列扫描,显著提高效率。

示例代码

def maintain_skyline(grid):
    # 初始化辅助数组
    max_row = [0] * len(grid)
    max_col = [0] * len(grid[0])

    # 行扫描
    for i in range(len(grid)):
        for j in range(len(grid[0])):
            if i > 0:
                max_row[i] = max(max_row[i], grid[i - 1][j])
            max_row[i] = max(max_row[i], grid[i][j])

    # 列扫描
    for j in range(len(grid[0])):
        for i in range(len(grid)):
            if j > 0:
                max_col[j] = max(max_col[j], grid[i][j - 1])
            max_col[j] = max(max_col[j], grid[i][j])

    # 高度调整
    for i in range(len(grid)):
        for j in range(len(grid[0])):
            grid[i][j] = max(max_row[i], max_col[j])

    # 返回更新后的数组
    return grid

总结

通过精心设计的算法和优化策略,我们征服了“力扣一日一练”的第 27 个挑战。掌握保持城市天际线的艺术,我们为虚拟都市创造了更宏伟的轮廓。