Largest Rectangle in Histogram 直方图的最大正方形

这个算法的思想动态规划  直方体数组 height[ ]

维护一个 栈s,栈里的元素是递增排列的,存的是heigth数组的下标。从左到右扫描height[i],如果数值大于栈顶的元素,栈中元素出栈,直到栈中元素小于height[i]为止。每次出栈的元素记为last,计算之前的以此为高height[last]的长方体的体积,与最大值比较选取最大值。

这个体积的计算很有讲究,用的是此时栈顶的元素所代表下标(s.top()+1)代表长方体长的开始,长方体长的结束是i 。原因在于s.top()之后的高肯定是大于height[last]的,想清楚了这一点,此题可解。

int largestRectangleArea(vector<int> &height) {
         stack<int> s;
        int maxx=0;
        int len=height.size();
        for(int i=0;i<len;i++){
            
            while(!s.empty()&&height[s.top()]>height[i]){
                int last= s.top();
                s.pop();
                if(!s.empty()){
                    maxx =max(maxx,(i-s.top()-1)*height[last]);
                }
                else{
                    maxx=max(maxx,i*height[last]);
                }
            }
            s.push(i);
        }
         while(!s.empty()){
                int last= s.top();
                s.pop();
                if(!s.empty()){
                    maxx =max(maxx,(len-s.top()-1)*height[last]);
                }
                else{
                    maxx=max(maxx,len*height[last]);
                }
            }
            return maxx;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值