当前位置: 首页 > news >正文

【leetcode hot 100 84】柱状图中最大的矩形

解法一:单调栈

class Solution {
    public int largestRectangleArea(int[] heights) {
        int len = heights.length;
        int area = 0;
        // 先做一些特殊判断
        if(len==0){
            return 0;
        }
        if(len==1){
            return heights[0];
        }

        // 进入栈后发现后面更短,可以得到当前这个能勾勒的面积 =》 先进后出 符合栈
        Deque<Integer> stack = new LinkedList<>();
        for(int i=0;i<len;i++){
            while(!stack.isEmpty() && heights[i]<heights[stack.peek()]){
                // 当前元素严格小于栈顶元素,则可以勾勒当前元素
                int height = heights[stack.pop()];
                int width;
                if(stack.isEmpty()){
                    // 如果栈是空的,宽度就为i(可以从0开始勾勒)
                    width = i;
                }
                else{
                    width = i-stack.peek()-1;  // 这里要多-1,i指的是下一个准备入栈的
                }
                area = Math.max(area, height*width);
            }
            stack.push(i); // 当前元素不知道后面情况,无法勾勒,入栈
        }

        // 处理栈内未处理完的元素
        while(!stack.isEmpty()){
            // 当前元素严格小于栈顶元素,则可以勾勒当前元素
            int height = heights[stack.pop()];
            int width;
            if(stack.isEmpty()){
                // 如果栈是空的,宽度就为i(可以从0开始勾勒)
                width = len;
            }
            else{
                width = len-stack.peek()-1;
            }
            area = Math.max(area, height*width);
        }

        return area;
    }
}

注意:

  • width = i-stack.peek()-1 这里要多-1,i指的是下一个准备入栈的
  • 如果栈是空的,宽度就为i(可以从0开始勾勒):width = i

相关文章:

  • LeetCode热题100题|1.两数之和,49.字母异位词分组
  • [WEB开发] Mybatis
  • CSP历年题解
  • Android 启动流程详解:从上电到桌面的全流程解析
  • Netty源码—7.ByteBuf原理四
  • K8s证书--运维之最佳选择(K8s Certificate - the best Choice for Operation and Maintenance)
  • 主键id设计
  • 华为OD机试A卷 - 积木最远距离(C++ Java JavaScript Python )
  • 文件描述符,它在哪里存的,exec()后还存在吗
  • 【STM32】对stm32F103VET6指南者原理图详解(超详细)
  • 支付页面安全与E-Skimming防护----浅谈PCI DSS v4.0.1要求6.4.3与11.6.1的实施
  • ✨分享我在飞书多维表格中使用DeepSeek的经历✨
  • STM32F103_LL库+寄存器学习笔记05 - GPIO输入模式,捕获上升沿进入中断回调
  • 飞速(FS)InfiniBand解决方案助力领先科技公司网络升级
  • kettle插件-mysql8数据库插件
  • MySQL进阶
  • 【linux复习】——进程间通信
  • 【HarmonyOS NEXT】EventHub和Emitter的使用场景与区别
  • 基于javaweb的SpringBoot雪具商城系统设计与实现(源码+文档+部署讲解)
  • UART(通用异步收发传输器)
  • 马上评|“衣服越来越难买”,对市场是一个提醒
  • 中科飞测将投资超10亿元,在上海张江成立第二总部
  • 车载抬头显示爆发在即?业内:凭借市场和产业链优势,国内供应商实现反超
  • 山东市监局回应“盒马一批次‘无抗’鸡蛋抽检不合格后复检合格”:系生产商自行送检
  • 《蛮好的人生》:为啥人人都爱这个不完美的“大女主”
  • 董军同法国国防部长举行会谈