问题描述
小S最近在分析一个数组 ℎ 1 , ℎ 2 , . . . , ℎ 𝑁 h 1 ,h 2 ,...,h N ,数组的每个元素代表某种高度。小S对这些高度感兴趣的是,当我们选取任意 𝑘 k 个相邻元素时,如何计算它们所能形成的最大矩形面积。
对于 𝑘 k 个相邻的元素,我们定义其矩形的最大面积为:
R(k)=k×min(h[i],h[i+1],...,h[i+k−1])
即, 𝑅 ( 𝑘 ) R(k) 的值为这 𝑘 k 个相邻元素中的最小值乘以 𝑘 k。现在,小S希望你能帮他找出对于任意 𝑘 k, 𝑅 ( 𝑘 ) R(k) 的最大值。
测试样例 样例1:
输入:n = 5, array = [1, 2, 3, 4, 5] 输出:9
样例2:
输入:n = 6, array = [5, 4, 3, 2, 1, 6] 输出:9
样例3:
输入:n = 4, array = [4, 4, 4, 4] 输出:16
代码表示
def solution(n, array): max_area = 0 stack = [] # 用于存储索引
for i in range(n):
while stack and array[i] < array[stack[-1]]:
# 计算以栈顶元素为高度的矩形面积
h = array[stack.pop()]
w = i if not stack else i - stack[-1] - 1
max_area = max(max_area, h * w)
stack.append(i)
# 处理栈中剩余的元素
while stack:
h = array[stack.pop()]
w = n if not stack else n - stack[-1] - 1
max_area = max(max_area, h * w)
return max_area
问题理解
我们需要在一个数组中找到任意 (k) 个相邻元素所能形成的最大矩形面积。矩形的面积定义为这 (k) 个相邻元素中的最小值乘以 (k)。
数据结构选择
我们可以使用栈来帮助我们高效地计算最大矩形面积。栈可以帮助我们在 (O(n)) 的时间复杂度内解决这个问题。
算法步骤
初始化:创建一个栈来存储数组中元素的索引,初始时栈为空。
遍历数组: 对于数组中的每一个元素:
如果栈不为空且当前元素的高度小于栈顶元素的高度,则计算以栈顶元素为高度的矩形面积,并更新最大面积。 将当前元素的索引压入栈中。
处理栈中剩余元素: 在遍历结束后,栈中可能还剩下一些元素,这些元素可以形成一个矩形,我们需要计算这些矩形的面积并更新最大面积。
具体步骤
遍历数组:
对于每一个元素,如果栈不为空且当前元素的高度小于栈顶元素的高度,则计算以栈顶元素为高度的矩形面积,并更新最大面积。 将当前元素的索引压入栈中。
处理栈中剩余元素: 在遍历结束后,栈中可能还剩下一些元素,这些元素可以形成一个矩形,我们需要计算这些矩形的面积并更新最大面积。
降低时间复杂度:
通过使用栈,我们可以在 (O(n)) 的时间复杂度内解决这个问题。栈帮助我们在遍历数组时,高效地找到每个元素作为最小高度时所能形成的最大矩形面积。栈中的元素保持递增的高度顺序,当遇到一个比栈顶元素小的高度时,我们可以计算以栈顶元素为高度的矩形面积,并更新最大面积。最后,处理栈中剩余的元素,计算这些元素形成的矩形面积并更新最大面积。
总结
通过使用栈来维护数组中元素的索引,我们可以高效地计算最大矩形面积。栈中的元素保持递增的高度顺序,当遇到一个比栈顶元素小的高度时,我们可以计算以栈顶元素为高度的矩形面积,并更新最大面积。最后,处理栈中剩余的元素,计算这些元素形成的矩形面积并更新最大面积。