单调栈part3 | 84.柱状图中最大的矩形

文章讨论了如何使用单调栈解决84题——柱状图中最大的矩形问题,强调了栈内元素顺序的重要性,并对比了此问题与接雨水问题的区别。主要涉及三种情况的分析:当前元素大于、等于或小于栈顶元素。提供的代码实现包括栈的操作和结果计算。


84.柱状图中最大的矩形

思路

只有栈里从大到小的顺序,才能保证栈顶元素找到左右两边第一个小于栈顶元素的柱子。

所以本题单调栈的顺序正好与接雨水反过来。

此时大家应该可以发现其实就是栈顶和栈顶的下一个元素以及要入栈的三个元素组成了我们要求最大面积的高度和宽度

理解这一点,对单调栈就掌握的比较到位了。

除了栈内元素顺序和接雨水不同,剩下的逻辑就都差不多了,在题解42. 接雨水 (opens new window)我已经对单调栈的各个方面做了详细讲解,这里就不赘述了。

主要就是分析清楚如下三种情况:

情况一:当前遍历的元素heights[i]大于栈顶元素heights[st.top()]的情况
情况二:当前遍历的元素heights[i]等于栈顶元素heights[st.top()]的情况
情况三:当前遍历的元素heights[i]小于栈顶元素heights[st.top()]的情况

思路代码

func largestRectangleArea(heights []int) int {
    stack:=[]int{}
    heights=append([]int{0},heights...)
    heights=append(heights,0)
    res:=0
    for i:=0;i<len(heights);i++{
        for len(stack)>0&&heights[i]<heights[stack[len(stack)-1]]{
            mid:=stack[len(stack)-1]
            stack=stack[:len(stack)-1]
            left:=stack[len(stack)-1]
            res=max(res,heights[mid]*(i-left-1))
        }
        stack=append(stack,i)
    }
    return res
}

func max(i,j int)int{
    if i<j{
        return j
    }
    return i
}

困难

开头结尾+0


今日收获

接雨水和柱状图在使用单调栈的时候都是为了判断左右两侧宽度的值。

总结

第一遍完结!!后续贪心,动态规划和单调栈需要加强!!!
也要掌握常用的手撕比如树的遍历

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值