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

【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

http://www.kler.cn/a/610573.html

相关文章:

  • 如何安装及使用 Postman 中文版?
  • 7.2 分治-快排:LeetCode 912. 排序数组
  • 从手机到机器人:vivo 凭借用户主义重构科技价值
  • 如何用 Postman 发送 GET 请求?详解
  • .gitattributes与git lfs
  • Unity 游戏开发 0 基础就业班:开启你的游戏开发职业之旅
  • 如何在 Mac 上安装并使用 Postman?
  • 速盾:Python可以用高防CDN吗?
  • Open CASCADE学习|基于AIS_PointCloud显示点集
  • 【Python · PyTorch】时域卷积网络 TCN
  • Mybatis配置文件解析(详细)
  • 创智未来“人工智能机器人研学活动启动政企学研联动培育科技新苗
  • 新能源智慧灯杆是否支持新能源汽车充电功能?
  • WordPress上传图片时显示“未提供数据”错误
  • 【读书笔记】华为《从偶然到必然》
  • 策略模式 (Strategy)
  • 网站服务器常见的CC攻击防御秘籍!
  • Java-设计模式
  • 可持久化(线段树(主席树),tire)
  • Angular的理解