返回

无须过多解读,保持城市天际线只需简单贪心即可

后端

当然,简单贪心是解决这道题的关键,让我们来探索一下。

前情提要

这道题的题意是这样的:

在一个二维数组 grid 中,grid[i][j] 表示位于某处的建筑物的高度。我们需要找到一组新的建筑物高度,使得天际线保持水平。

换句话说,对于每一列,建筑物的高度必须是这一列中最高的高度。

贪心的直觉

从题意中我们可以看出,贪心算法是一种很有希望的解决方法。

因为我们只需要考虑每一列的最高高度,而不需要考虑其他列的情况。

贪心算法的步骤

根据贪心的直觉,我们可以得出以下的贪心算法步骤:

  1. 对于每一列,找到最高的高度。
  2. 将这一列的所有建筑物的高度都设置为这个最高的高度。
  3. 重复步骤 1 和 2,直到所有列都处理完毕。

实例解析

为了更好地理解这个贪心算法,我们来看一个简单的例子。

给定一个二维数组 grid

[[3, 0, 8, 4],
 [2, 4, 5, 7],
 [9, 2, 6, 3],
 [0, 3, 1, 0]]

按照贪心算法的步骤,我们首先找到每一列的最高高度:

[9, 7, 8, 7]

然后,我们将每一列的所有建筑物的高度都设置为这个最高的高度:

[[9, 0, 8, 7],
 [9, 4, 8, 7],
 [9, 9, 8, 7],
 [0, 9, 1, 0]]

现在,天际线已经保持水平了。

贪心算法的正确性证明

为了证明这个贪心算法的正确性,我们需要证明它能找到一个合法的天际线。

一个合法的天际线是指:

  1. 对于每一列,建筑物的高度必须是这一列中最高的高度。
  2. 天际线必须是水平的。

根据贪心算法的步骤,我们可以证明它能满足这两个条件:

  1. 对于每一列,贪心算法都会找到最高的高度,并将这一列的所有建筑物的高度都设置为这个最高的高度。因此,每一列的建筑物的高度都是这一列中最高的高度。
  2. 由于贪心算法是逐列处理的,因此它能保证天际线是水平的。

贪心算法的复杂度分析

这个贪心算法的时间复杂度是 O(n * m),其中 ngrid 的行数,mgrid 的列数。

这是因为贪心算法需要遍历整个 grid,并且对于每一列,它需要找到最高的高度,并将这一列的所有建筑物的高度都设置为这个最高的高度。

总结

在这篇文章中,我们讨论了如何使用贪心算法来解决 LeetCode 上的 807. 保持城市天际线 这道题目。

我们首先介绍了这道题的题意,然后给出了贪心算法的步骤和实例解析。

接下来,我们证明了贪心算法的正确性,并分析了它的复杂度。

最后,我们总结了贪心算法的优缺点,并给出了它的适用范围。