[Leetcode题解]84. 柱状图中最大的矩形(单调栈)

84. 柱状图中最大的矩形

image.png

暴力

思路

枚举全部左右边界,而后找到区间内的最小值。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
相关文章
相关标签/搜索