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

文章介绍了如何使用单调栈解决找到柱状图中最大矩形面积的问题,强调了维护单调递减栈的重要性,以及在计算宽度时避免直接用当前索引减去栈顶索引的原因。此外,解释了在输入数组首尾添加0的细节,确保处理各种顺序的数组情况。
摘要由CSDN通过智能技术生成

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

柱状图中最大的矩形

LeetCode题目:https://leetcode.cn/problems/largest-rectangle-in-histogram/

  本题与接雨水相似,但有所不同。如果在该题中维护一个从栈顶到栈底单调递增的单调栈,那么计算的面积都会被最小的高度值所限制,需要各种的判定不说,计算结果也存在问题!

  因此,为了避免被最小的高度值所限制,维护一个从栈顶到栈底单调递减的单调栈比较好。此时,当遇到比栈顶元素要小的当前元素值的时候,就可以从当前栈顶元素作为高度,栈顶元素的下标和当前元素值的下标求差值,即是矩形的宽度。

  此处要注意一个细节,即宽度的计算(i - left - 1),可能会疑问为什么不能直接(i - mid)呢?这是因为的单调栈的元素不一定是连续的。

  此外,对height数组首尾分别添加0的作用

末尾加0:如果数组本身就是升序的,例如[2,4,6,8],那么入栈之后 都是单调递减,一直都没有走 情况三 计算结果的哪一步,所以最后输出的就是0了。

首部加0:数组本身是降序的,那么第一个元素会因为代码逻辑的问题,提取后栈为空值,无法进行计算。但可能该部分为最大值。

  代码如下:

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        int result = 0;
        stack<int> recStack;

        heights.insert(heights.begin(), 0);
        heights.push_back(0);
        recStack.push(0);

        for (int i = 1; i < heights.size(); i++) {
            if (heights[i] >= heights[recStack.top()]) {
                recStack.push(i);
            }else {
                while (!recStack.empty() && heights[i] < heights[recStack.top()]) {
                    int mid = recStack.top();
                    recStack.pop();
                    if (!recStack.empty()) {
                        int left = recStack.top();
                        result = max(result, (i - left - 1) * heights[mid]);
                    }
                }
                recStack.push(i);
            }
        }
        return result;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值