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;
    }
};

结束了!!

相关推荐
派阿喵搞电子3 小时前
在UI界面内修改了对象名,在#include “ui_mainwindow.h“没更新
c++·qt·ubuntu·ui
C++ 老炮儿的技术栈4 小时前
UDP 与 TCP 的区别是什么?
开发语言·c++·windows·算法·visual studio
殇者知忧4 小时前
【论文笔记】若干矿井粉尘检测算法概述
深度学习·神经网络·算法·随机森林·机器学习·支持向量机·计算机视觉
mochensage6 小时前
CSP信奥赛C++常用系统函数汇总
c++·信奥
mochensage6 小时前
C++信息学竞赛中常用函数的一般用法
java·c++·算法
fpcc6 小时前
跟我学c++中级篇——多线程中的文件处理
c++
chengooooooo6 小时前
leetcode Top100 238. 除自身以外数组的乘积|数组系列
算法·leetcode
GUIQU.6 小时前
【每日一题 | 2025年6.2 ~ 6.8】第16届蓝桥杯部分偏简单题
算法·蓝桥杯·每日一题
5:007 小时前
云备份项目
linux·开发语言·c++
weixin_527550407 小时前
初级程序员入门指南
javascript·python·算法