柱状图最大矩形面积算法详解:单调栈解法
给定一个整数数组 nums,其中每个元素表示该位置的高度。要求计算由柱状图形成的内容:矩形的最大面积。
解决这个问题可以使用单调栈的思想。首先创建一个栈和一个结果变量 maxArea,将栈初始化为空,并将结果变量 maxArea 初始化为 0。
然后遍历数组 nums,对于每一个元素 nums[i],进行如下操作:
- 如果栈为空或者当前元素
nums[i]大于等于栈顶元素的高度,则将当前元素的索引i入栈。 - 否则,弹出栈顶元素,计算以该栈顶元素为高度的矩形的面积,并更新结果变量
maxArea。计算矩形的面积可以使用当前栈顶元素的高度乘以当前元素的索引与栈顶元素索引的差值。 - 重复上述操作,直到栈为空或者当前元素
nums[i]大于等于栈顶元素的高度。
遍历结束后,如果栈不为空,说明还有一些元素没有被处理。此时需要对剩余的元素进行处理。对于每一个剩余元素,弹出栈顶元素,计算以该栈顶元素为高度的矩形的面积,并更新结果变量 maxArea。
最后返回结果变量 maxArea。
下面是具体的实现代码:
def largestRectangleArea(nums):
stack = []
maxArea = 0
for i in range(len(nums)):
while stack and nums[i] < nums[stack[-1]]:
height = nums[stack.pop()]
width = i if not stack else i - stack[-1] - 1
maxArea = max(maxArea, height * width)
stack.append(i)
while stack:
height = nums[stack.pop()]
width = len(nums) if not stack else len(nums) - stack[-1] - 1
maxArea = max(maxArea, height * width)
return maxArea
时间复杂度分析:遍历数组需要 O(n) 的时间复杂度,每个元素最多入栈一次,出栈一次,所以栈的操作总共需要 O(n) 的时间复杂度。因此,总的时间复杂度是 O(n)。
空间复杂度分析:栈最多存储 n 个元素,所以空间复杂度是 O(n)。
原文地址: https://www.cveoy.top/t/topic/o2by 著作权归作者所有。请勿转载和采集!