枚举全部左右边界,而后找到区间内的最小值。app
复杂度o(n^3)优化
耗时太久,故代码略spa
选取以某个柱子为高,而后左右扩散,保证没有比他小的。code
复杂度o(n^2)blog
代码略leetcode
这里实际上是对暴力优化解法的一种优化,避免了重复的计算。get
维护一个单调栈,从小到大
每次遍历一根柱子的时候,若是她比栈顶的大,就入栈,若是他比栈顶的小,就出栈,为何?由于这个时候比他高的柱子为高的矩形的右边界已经能够肯定了!
好比上图中遍历到2的时候,将6,5退栈一直到栈顶元素小于2,例子中也就是栈顶为1的时候。为何?这个时候5,6的右边界已经肯定了,是2这根柱子(不包含这根),左边怎么肯定呢?很简单,退栈6的时候他的左边距就是栈顶元素,也就是5.为何由于栈里的元素都是递增的,因此比他小且最大的元素必定在栈顶。it
这里加了一些边界值,方便判断边界状况。io
复杂度:o(n)class
代码以下:
from typing import List from collections import deque class Solution: def largestRectangleArea(self, heights: List[int]) -> int: queue, n, ans = deque(), len(heights), 0 queue.append(-1) heights.append(-1) for index, h in enumerate(heights[:n+1]): if h > heights[queue[-1]]: queue.append(index) else: while heights[queue[-1]] > h: t = queue.pop() left_index, right_index = queue[-1], index ans = max((right_index - left_index - 1) * heights[t], ans) queue.append(index) return ans