84:Largest Rectangle in Histogram【数组】【栈】

题目链接:click~

/*题意:N个非负整数,分别代表宽为1的柱子,从图中找出最大矩形的面积*/

/**
 *思路: 观察发现,只有较矮的柱子才能和其它柱子构成矩形。比较相邻的两个
 *     柱子:
 *     1)如果后面的柱子比前面的矮,如1比2矮,那么2在以后的计算中已经
 *     没什么用,这时候计算2和之前的柱子组成的最大矩形。
 *     2)如果后面的柱子比前面的高,如1和5,这两根柱子可以和后面的柱子组成矩形
 *
 *        用一个栈记录上升的柱子(柱子的位置可能是不连续的),如果遇到下降的柱子,
 *     开始计算栈顶和之前柱子构成的矩形面积。栈保存的是柱子的下标,而不是柱子
 *     的高度。目的是方便计算矩形的宽度。遇到上升的柱子,压入栈中
 */


class Solution {
public:
    int largestRectangleArea(vector<int>& height) {
        int len = height.size(), maxx = 0;
        stack<int> s;
        s.push(-1);//方便计算相对距离
        for(int i = 0; i < len; i ++) {
            int pre = s.top();
            if(pre < 0 || height[i] >= height[pre])//上升的柱子,压入栈中
                s.push(i);
            else {
                s.pop();
                maxx = max(maxx, height[pre]*(i-s.top()-1));
                i--;//不确定当前元素是否在上升序列中
            }
        }

        //栈中还有元素,表明柱子到结尾都是上升的
        while(s.top() != -1) {
            int pre = s.top();
            s.pop();
            maxx = max(maxx, height[pre]*(len-s.top()-1));
        }
        return maxx;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值