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

结束了!!

相关推荐
Jerry7 分钟前
LeetCode 28. 找出字符串中第一个匹配项的下标
算法
Jerry2 小时前
LeetCode 459. 重复的子字符串
算法
哥不想学算法5 小时前
【C++】字符串字面量拼接
开发语言·c++
海石5 小时前
1500分的题目,确实有实力,不过还是我略胜一筹
算法·leetcode
海石5 小时前
【记忆化搜索】条条大路通AC,走好适合你的那一条,走到后再考虑走得快
算法·leetcode
Jerry7 小时前
LeetCode 151. 反转字符串中的单词
算法
gugucoding7 小时前
31. 【C语言】堆栈与队列的实现
c语言·开发语言·数据结构·链表
ChaoZiLL9 小时前
我的数据结构3——链表(link list)
数据结构·链表
a1117769 小时前
LM 算法迭代过程动画演示(SLAM)
算法
头茬韭菜9 小时前
Context 的生死抉择:四层压缩、截断算法与 Session Memory
算法·ai