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]),把它们加到单调栈里之后,栈里就是单调递减的顺序,就不会执行heights[i] < heights[st.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;
    }
};

结束了!!

相关推荐
第七序章30 分钟前
【C++STL】list的详细用法和底层实现
c语言·c++·自然语言处理·list
仙俊红30 分钟前
LeetCode每日一题,20250914
算法·leetcode·职场和发展
逆小舟2 小时前
【Linux】人事档案——用户及组管理
linux·c++
风中的微尘7 小时前
39.网络流入门
开发语言·网络·c++·算法
混分巨兽龙某某8 小时前
基于Qt Creator的Serial Port串口调试助手项目(代码开源)
c++·qt creator·串口助手·serial port
西红柿维生素8 小时前
JVM相关总结
java·jvm·算法
小冯记录编程8 小时前
C++指针陷阱:高效背后的致命危险
开发语言·c++·visual studio
C_Liu_9 小时前
C++:类和对象(下)
开发语言·c++
coderxiaohan9 小时前
【C++】类和对象1
java·开发语言·c++
阿昭L9 小时前
MFC仿真
c++·mfc