像是在玩一个寻找最大宝藏的游戏。想象一下,你有一个由不同高度的小山丘组成的地图,每个小山丘都有一个高度值。你的任务是找到一个连续的区域,这个区域里可以放下一个最大的矩形,而且这个矩形的高度是这个区域里所有小山丘中最低的那个。
这个问题可以看作是在一个由数组元素表示的高度图中,找到一个矩形,使得这个矩形的面积最大。这个矩形的宽度是连续的k个元素,高度是这k个元素中的最小值。我们的目标是找到所有可能的k值中,这个矩形面积的最大值。
为了解决这个问题,我们可以采用一种叫做“单调栈”的数据结构。单调栈可以帮助我们快速找到每个元素作为最小值时,能够覆盖的最大范围。具体步骤如下:
-
初始化单调栈:创建一个空的单调栈,用于存储数组元素的索引。这个栈的特点是,从栈底到栈顶,元素对应的值是单调递增的。
-
遍历数组:从左到右遍历数组中的每个元素。对于每个元素,我们执行以下操作:
- 如果当前元素小于栈顶元素对应的值,那么我们从栈中弹出元素,直到栈为空或者当前元素大于等于栈顶元素对应的值。在弹出元素的过程中,我们计算以弹出元素为最小值的矩形面积,并更新最大面积。
- 将当前元素的索引压入栈中。
-
处理剩余元素:在遍历完所有元素后,如果栈中还有元素,我们继续弹出元素,并计算以这些元素为最小值的矩形面积,直到栈为空。
-
返回最大面积:最后,我们返回在上述过程中计算出的最大面积。
这个算法的时间复杂度是O(n),因为每个元素最多被压入和弹出栈一次。空间复杂度是O(n),因为最坏情况下,所有元素都可能被压入栈中。
通过这个算法,我们可以高效地找到最大矩形面积。这个算法的巧妙之处在于,它利用了单调栈的性质,将问题转化为求解每个元素作为最小值时的最大覆盖范围,从而避免了直接枚举所有可能的k值,大大提高了效率。
def solution(n, array):
max_area = 0
for k in range(1, n + 1):
for i in range(n - k + 1):
min_height = min(array[i:i + k])
area = k * min_height
max_area = max(max_area, area)
return max_area
if __name__ == "__main__":
# Add your test cases here
print(solution(5, [1, 2, 3, 4, 5]) == 9)