代码随想录算法训练营第六十天|84.柱状图中最大的矩形

LeetCode 84 柱状图中最大的矩形

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

思路:

要找到当前元素左边第一个比它小的和右边第一个比它小的,从而计算出矩形的宽度,矩形的高度就是当前元素的值。

所以可以用单调栈来完成任务,本题栈内元素应为单调递减

代码:

  • 首尾为何加0?

首部加0是为了杜绝以下情况:[8,6,4,2]

首先是8在栈内,然后到元素6,因为元素6小于栈口元素(即8),此时应该跳到计算过程,然而计算过程中需要有三个数,当把栈内元素(8)弹出之后,栈变成了空栈,会出现操作空栈的情况,所以需要在首部加个0,避免此种情况。

尾部加0是为了杜绝以下情况:[2,4,6,8]

因为本身数组是单调递减的,所以加入到栈之后,栈中元素也是单调递减的:8,6,4,2](右边为栈底),这样的话就没有办法跳转到计算过程,因此需要在尾部加个0,从而使得可以进入到计算过程中。

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

        if(heights.empty()) return result;

        // 防止出现在计算过程中出现空栈的情况
        heights.insert(heights.begin(), 0);
        heights.push_back(0);

        stack<int>st;
        st.push(0);

        for(int i = 1; i < heights.size(); i++)
        {
            if(heights[i] >= heights[st.top()])
                st.push(i);
            else
            {
                while(!st.empty() && heights[i] < heights[st.top()])
                {
                    int mid = st.top();
                    st.pop();
                    int left = st.top();
                    int w = i - left - 1;
                    result = max(w * heights[mid], result);
                }
                st.push(i);
            }
        }

        return result;
    }
};

总结

和接雨水的题目相类似

今日总结:

一刷代码随想录结束!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值