问题描述
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
示例 1:
输入:heights = [2,1,5,6,2,3]
输出:10
解释:最大的矩形为图中红色区域,面积为 10
示例 2:
输入: heights = [2,4]
输出: 4
提示:
1 <= strs.length <= 104
0 <= strs[i].length <= 100
暴力求解:
面积 = 宽(几个数字的数量)* 高 (其中最小的数字的值)
从头开始,对于每一个元素搜索一遍后面所有的元素,输出面积最大的值。
class Solution:
def largestRectangleArea(self, heights: List[int]) -> int:
area = 0
n = len(heights)
for i in range(n):
for j in range(i, n):
w = j - i + 1
h = min(heights[i:j+1])
s = w * h
area = s if s > area else area
return area
算法复杂度:
O
(
N
2
)
O(N^2)
O(N2)
如果 LeetCode 上提交暴力求解的代码,会因为超时不通过。
栈
创建栈,存储还无法确定边界的柱子下标。如果右边的柱子高度比栈顶矮,开始从栈顶弹出并计算面积。
class Solution:
def largestRectangleArea(self, heights: List[int]) -> int:
heights.append(0) # 列尾插入哨兵
stack = [-1] # 栈首插入哨兵
area = 0
n = len(heights)
for i in range(n):
while(heights[i] < heights[stack[-1]]):
k = stack.pop()
left = stack[-1]
width = i - left - 1
s = width * heights[k]
area = s if s > area else area
stack.append(i)
return area
算法复杂度: O ( N ) O(N) O(N)

1155

被折叠的 条评论
为什么被折叠?



