Python 解决方案:Largest Rectangle Hackerrank

2024 年 8 月 29 日 | 4 分钟阅读

Hackerrank 是一个流行的在线编程挑战平台,其中最受欢迎的问题之一是“最大矩形”问题。此问题要求您在给定的直方图中找到最大的矩形面积。在本文中,我们将通过 Python 中的此问题解决方案进行讲解。

问题陈述

您将获得一个表示直方图高度的高度列表。您的任务是找到直方图中最大的矩形面积。每个矩形的宽度视为1,相应直方图条的高度给出高度。

解决方案

为了解决这个问题,我们可以使用堆栈数据结构。我们开始初始化一个空堆栈,并遍历高度列表。对于每个高度,我们执行以下步骤:

  1. 如果堆栈为空,或者当前高度大于或等于堆栈顶部的高度,则将当前索引压入堆栈。
  2. 如果当前高度小于堆栈顶部的高度,则弹出堆栈中的顶部索引,并计算由弹出索引处的高度和当前索引形成的矩形的面积。
  3. 我们重复步骤 2,直到堆栈顶部的高度小于或等于当前高度。对于每个弹出的索引,我们将矩形的面积计算为(当前索引 - 弹出的索引)*弹出索引处的高度
  4. 我们将当前索引压入堆栈。
  5. 遍历完所有高度后,我们弹出堆栈中剩余的所有索引,并使用与步骤 3 相同的公式计算矩形的面积。
  6. 我们在每一步跟踪计算出的最大面积,并将最大面积作为答案返回。

示例

让我们看看这个解决方案在 Python 代码中是什么样的

在此代码中,我们初始化一个空堆栈和一个用于存储最大面积的变量。之后,我们使用 while 循环遍历高度列表。在循环中,我们检查堆栈是否为空,或者当前高度是否大于或等于堆栈顶部的高度。如果其中任一条件为真,我们将当前索引压入堆栈并将i增加1

如果当前高度小于堆栈顶部的高度,我们弹出堆栈中的顶部索引,并计算由弹出索引处的高度和当前索引形成的矩形的面积。我们使用公式(i - stack[-1] - 1) * h[top]来计算面积,其中i当前索引,stack[-1]是堆栈顶部的索引,h[top]是弹出索引处的高度。

我们重复步骤 2,直到堆栈顶部的高度小于或等于当前高度。对于每个弹出的索引,我们将矩形的面积计算为(i - stack[-1] - 1) * h[top]。如果堆栈为空,我们将使用公式i * h[top]

让我们在示例输入上测试我们的解决方案

输出

12

在这里,我们有一个直方图,其高度为 [6, 2, 5, 4, 5, 1, 6]。该直方图中最大的矩形高度为4,宽度为3,因此其面积为12。我们的函数正确地返回12作为输出。

结论

总之,我们已经看到了如何使用 Python 中的堆栈数据结构解决 Hackerrank 上的“最大矩形”问题。此问题是如何有效地使用堆栈数据结构解决复杂问题的一个很好的例子。关键的见解是,我们可以使用堆栈来跟踪直方图中形成递增高度矩形的条的索引。通过这样做,我们可以避免计算我们知道会小于我们迄今为止找到的最大面积的面积。