剑指 Offer II 039. 直方图最大矩形面积

剑指 Offer II 039. 直方图最大矩形面积
在这里插入图片描述

leetcode 上好像可以直接两重循环查找不会超时。做cf的时候做到了相似题 顺手把leetcode这道题写了。一下给出单调栈的优化代码

思路:单调栈进行存储每个加入元素的val,和index 。 当遇到比它小的值直接弹出,再贪心记录 面积

1.当当前遍历值 a[i] >= 栈顶元素,直接将<a[i],i> 压入栈

  1. 当当前遍历值 a[i] < 栈顶元素时,将栈顶元素弹出,并记录:
    a n s = m a x ( a n s , v a l ∗ ( i − i n d e x ) ) ans = max(ans , val * (i - index)) ans=max(ans,val(iindex))

找到最后弹出的index 作为 当前值得index, 压入栈

3.最后一步,不要忘记清空栈内元素.

class Solution {
    public int largestRectangleArea(int[] a) {    
        Deque<int[]> q = new LinkedList<>();
        q.offer(new int[]{a[0],0});
        int ans = 0;
        for(int i = 1; i < a.length;i++){
                if(!q.isEmpty() && q.peek()[0] > a[i]){
                    int[] h = q.peek();
                    while(!q.isEmpty() && q.peek()[0]>a[i]){  //  弹出栈顶元素
                        h = q.poll();
                        ans = Math.max(h[0]*(i-h[1]),ans);
                    }
                    q.push(new int[]{a[i],h[1]}); //  这一步很重要,找到最后弹出的index 作为 当前值得index, 压入栈
                }else{
                    q.push(new int[]{a[i],i});
                }
            }
        int[] h;
        while(!q.isEmpty()){
            h = q.poll();
            ans = Math.max(h[0]*(a.length-h[1]),ans);
        }
        return ans;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

渝北最后的单纯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值