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

结束了!!

相关推荐
那个村的李富贵8 小时前
CANN加速下的AIGC“即时翻译”:AI语音克隆与实时变声实战
人工智能·算法·aigc·cann
power 雀儿8 小时前
Scaled Dot-Product Attention 分数计算 C++
算法
Yvonne爱编码8 小时前
JAVA数据结构 DAY6-栈和队列
java·开发语言·数据结构·python
熬夜有啥好9 小时前
数据结构——哈希表
数据结构·散列表
琹箐9 小时前
最大堆和最小堆 实现思路
java·开发语言·算法
renhongxia19 小时前
如何基于知识图谱进行故障原因、事故原因推理,需要用到哪些算法
人工智能·深度学习·算法·机器学习·自然语言处理·transformer·知识图谱
坚持就完事了9 小时前
数据结构之树(Java实现)
java·算法
算法备案代理9 小时前
大模型备案与算法备案,企业该如何选择?
人工智能·算法·大模型·算法备案
赛姐在努力.10 小时前
【拓扑排序】-- 算法原理讲解,及实现拓扑排序,附赠热门例题
java·算法·图论
我能坚持多久10 小时前
【初阶数据结构01】——顺序表专题
数据结构