LeetCode 84. Largest Rectangle in Histogram

本文介绍了一种使用栈的数据结构来解决计算直方图中最大矩形面积问题的方法。通过遍历高度数组并利用栈维护非递减序列,算法能够高效地找到每个柱状区域所能构成的最大矩形面积。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用栈维护一个非递减的序列,例如 1 2 2 3

从左往右扫描数组,当前扫描到第i个,如果第i个的height小于栈顶元素的height,表示以栈顶元素的height为高的矩形不可能再向右扩充(因为右边的height已经小于栈顶元素的height),所以栈里面的元素中所有height>height[i]的元素往右能扩充到i-1的位置,往左能扩充到上一个比它小的元素的位置+1。


例如上图,当i==6时,栈内已有元素为1,2,3,4,5(元素的index),heights[6] < height[栈顶元素],5出栈,其他仍小于等于height[6]。当i==7时,开始计算栈内元素能构成的最大面积,例如i==3的元素能构成的最大面积为heights[3] * (7 - 2  - 1) = 8,i==2的元素能构成的最大面积为heights[2] * (7 - 1  - 1) = 10。

在heights数组首尾分别补一个0来控制边界条件。

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        int ans = 0;
        int n = heights.size();
        if(!n) return ans;
        
        heights.insert(heights.begin(), 0);
        heights.push_back(0);
        stack<int> s;
        for(int i = 0; i <= heights.size(); i++){
            while(!s.empty() && heights[s.top()] > heights[i]){
                int tmp = s.top();
                s.pop();
                int area = (i - s.top() - 1) * heights[tmp];
                ans = max(ans, area);
            }
            s.push(i);
        }
        return ans;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值