Day60|leetcode 84.柱状图中最大的矩形

leetcode 84.柱状图中最大的矩形

题目链接:84. 柱状图中最大的矩形 - 力扣(LeetCode)

视频链接:单调栈,又一次经典来袭! LeetCode:84.柱状图中最大的矩形_哔哩哔哩_bilibili
题目概述


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

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

示例 1:

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

示例 2:

复制代码
输入: heights = [2,4]
输出: 4

思路

做完接雨水那道题,在写这道题会好很多,刚开始读完题,我也先自己试着模拟了一下本题单调栈的过程,但是很明显差点意思,仿佛能行又感觉哪里不太对劲,说不上来的感觉🤔。

本题比上题多了些细节上的东西,还是记录单调栈的思路。

首先,先确定单调栈的顺序,要找的是左右两边第一个比中间柱子小的元素,所以单调栈是单调递减的顺序(栈头到栈尾),栈里放的是下标。

还有一个需要注意的就是在数组的前后位置都加上0!

如果数组是个升序数组(如:2,4,6,8),把它们加到单调栈里之后,栈里就是单调递减的顺序,就不会执行heightsi < heightsst.top()这种情况了,所以要在数组末尾的位置加上!

如果数组是个降序数组(如:8,6,4,2),首先8先进栈,之后6与8比较,然后8就被弹了出去,所以8就是mid,6是right,可是此时left就没了,因为8之前没有元素进栈,所以数组开头位置要加0!

代码实现

cpp 复制代码
class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        int result = 0;
        stack<int> st;
        heights.insert(heights.begin(), 0); // 数组头部加入元素0
        heights.push_back(0); // 数组尾部加入元素0
        st.push(0);

        // 第一个元素已经入栈,从下标1开始
        for (int i = 1; i < heights.size(); i++) {
            if (heights[i] > heights[st.top()]) { // 情况一
                st.push(i);
            } else if (heights[i] == heights[st.top()]) { // 情况二
                st.pop(); // 这个可以加,可以不加,效果一样,思路不同
                st.push(i);
            } else { // 情况三
                while (!st.empty() && heights[i] < heights[st.top()]) { // 注意是while
                    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];
                        result = max(result, w * h);
                    }
                }
                st.push(i);
            }
        }
        return result;
    }
};

结束了!!

相关推荐
lengxuenong21 分钟前
树状数组 · 信息学学习手册2-离散化与逆序对
c++·学习·算法
琳达爱分享22 分钟前
五个线程同时去换 token,四个被踢下线:刷新接口其实不是幂等的
后端·算法·架构
十二23 分钟前
【洛谷题解】P1115 最大子段和(前缀和 + 维护最小前缀)
数据结构·c++·算法·蓝桥杯
Xin77038 分钟前
LeetCode 46. 全排列(回溯法)
leetcode
renhongxia11 小时前
RAG检索增强生成:打通大模型与外部知识的通道
大数据·人工智能·算法
2501_933923251 小时前
双指针算法:移动零+复写零(Java)
数据结构·算法·双指针
和芯星通unicore2 小时前
卫星信号消失的地方,定位如何继续?——解密和芯星通DR 航位推算算法
人工智能·算法·gnss·智能驾驶gnss模块
邵奈一2 小时前
让WorkBuddy用上OpenCode免费模型:Magpie小白教程
算法
cu1432 小时前
细谈IT65631的具体功能与其应用
c++·单片机·嵌入式硬件
幻智星科技3 小时前
Karatsuba与CSD优化FPGA大数乘法
c++·fpga开发·密码学