首页 > 其他分享 >柱状图中最大的矩形(单调递增栈)

柱状图中最大的矩形(单调递增栈)

时间:2025-01-03 14:48:09浏览次数:1  
标签:heights 柱子 int st 柱状图 矩形 单调

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。

示例 1:

输入:heights = [2,1,5,6,2,3]
输出:10
解释:最大的矩形为图中红色区域,面积为 10

示例 2:

输入: heights = [2,4]
输出: 4

代码思想:

  • 进栈前弹出的都是左边比自己大的→确定左边界;
  • 出栈时必定是右边第一次遇到比自己小的→确定右边界
class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        // 维护一个单调递增栈,用于存储索引
        stack<int> st;

        // 在数组头部插入一个高度为0的柱子,防止原数组为单调递减
        heights.insert(heights.begin(), 0);

        // 在数组尾部插入一个高度为0的柱子,防止原数组为单调递增
        heights.push_back(0);

        // 初始化最大矩形面积为0
        int maxValue = 0;

        // 遍历整个高度数组
        for (int i = 0; i < heights.size(); i++) {
            // 当当前柱子高度小于栈顶柱子高度时,计算以栈顶柱子为高度的最大矩形面积
            while (!st.empty() && heights[i] < heights[st.top()]) {
                int mid = st.top();  // 栈顶元素的索引
                st.pop();  // 弹出栈顶元素

                if (!st.empty()) {
                    int left = st.top();  // 左边界是栈新的栈顶元素
                    int right = i;  // 右边界是当前柱子的索引
                    int w = right - left - 1;  // 矩形宽度
                    int h = heights[mid];  // 矩形高度
                    maxValue = max(maxValue, w * h);  // 更新最大矩形面积
                }
            }
            // 当前柱子索引入栈
            st.push(i);
        }

        // 返回最大矩形面积
        return maxValue;
    }
};

 

 

 

标签:heights,柱子,int,st,柱状图,矩形,单调
From: https://www.cnblogs.com/yueshengd/p/18650077

相关文章

  • 每日温度(单调递增栈)
    给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。 示例1:输入:temperatures=[73,74,75,71,69,72,76,73]输出: [1,1,4,2,1,1......
  • leetcode热题100(84. 柱状图中最大的矩形)c++
    链接:84.柱状图中最大的矩形-力扣(LeetCode)给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为1。求在该柱状图中,能够勾勒出来的矩形的最大面积。示例1:输入:heights=[2,1,5,6,2,3]输出:10解释:最大的矩形为图中红色区域,面积为10示......
  • 006. 滑动窗口 /【模板】单调队列(洛谷P1886)
    006.滑动窗口/【模板】单调队列(洛谷P1886)题目描述有一个长为\(n\)的序列\(a\),以及一个大小为\(k\)的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。例如,对于序列\([1,3,-1,-3,5,3,6,7]\)以及\(k=3\),有如下过程:\[\def\a......
  • 单调栈
    [Algo]单调栈基本模板:vector<vector<int>>lessThanIndex(vector<int>&arr){intlen=arr.size();vector<vector<int>>ans(len,vector<int>(2,0));stack<int>s;for(inti=0;i<len;i++)......
  • 应用Cesium+Echarts的结果可视化(绘制点要素+柱状图)
    注:以下仅为可视化示例,适合初学者学习或有相关功能需求的小白借鉴。Cesium绘制几何实体以及Echarts绘制图表的功能非常强大,大家可以根据需要自行调整:Cesium官方API文档https://www.vvpstk.com/public/Cesium/Documentation/ApacheECharts官方使用手册https://echarts.apache.o......
  • JVM内存模型、垃圾回收机制及简单调优方式
    JVM内存模型:1.方法区  用来存放类加载的信息,同时存放静态属性和方法(静态方法和普通方法)  jdk1.7之后,取消了方法区名称,改为元空间、方法区也叫元空间也叫永久区  方法区中的数据,可以被多线程共享。访问时会有数据共享的安全问题2.堆区  用来存放对象或数......
  • 使用 OpenCV 绘制线条和矩形
    OpenCV是一个功能强大的计算机视觉库,它不仅提供了丰富的图像处理功能,还支持图像的绘制。绘制简单的几何图形(如线条和矩形)是OpenCV中常见的操作。在本篇文章中,我们将介绍如何使用OpenCV在图像上绘制线条和矩形。绘制线条在OpenCV中,可以使用cv2.line()函数来绘制直线......
  • LeetCode题练习与总结:构造矩形--492
    一、题目描述作为一位web开发者,懂得怎样去规划一个页面的尺寸是很重要的。所以,现给定一个具体的矩形页面面积,你的任务是设计一个长度为L和宽度为W且满足以下要求的矩形的页面。要求:你设计的矩形页面必须等于给定的目标面积。宽度 W 不应大于长度 L ,换言之,要求 L>......
  • 84. 柱状图中最大的矩形
    题目链接解题思路:单调栈,以i位置为高度(宽),最长能有多长,其实就是找离i最近的,小于i的位置,其实就是单调栈代码classSolution:deflargestRectangleArea(self,heights:List[int])->int:#使用单调栈栈底到栈顶小到大stack=[]an......
  • 【多维DP】【准NOI难度】力扣3251. 单调数组对的数目 II
    给你一个长度为n的正整数数组nums。如果两个非负整数数组(arr1,arr2)满足以下条件,我们称它们是单调数组对:两个数组的长度都是n。arr1是单调非递减的,换句话说arr1[0]<=arr1[1]<=…<=arr1[n-1]。arr2是单调非递增的,换句话说arr2[0]>=ar......