84.柱形图中最大的矩阵

二刷终于能过了.

思路解析:

不愧是hard,第一步就很难想,     对于每一个矩阵,我们要想清楚怎么拿到最大矩阵, 对于每个height[i],我们需要找到left和right,left是i左边第一个小于height[i]的,right是右边第一个小于height[i]的,那么他的最大矩阵就是height[i] * (right-left-1), 遍历所有的i即可

但是对于1e5我们不可能用O(n^2),所有我们使用单调队列来优化这个取 left,right 的过程.具体说来就是

        把right数组设置初值len-1, 从左往右遍历, 如果当前元素小于队尾,就把队尾元素弹出,队尾元素对应的right就是当前的i ,直到队列为空,或者队尾元素大于等于当前元素,遍历结束还存在队列里面的元素的right是len-1

        left同理

        即是, 把left数组设置初值0, 从右往左遍历, 如果当前元素小于队尾,就把队尾元素弹出,队尾元素对应的left就是当前的i, 直到队列为空,或者队尾元素大于等于当前元素,遍历结束还存在队列里面的元素的right是0

具体代码如下:

class Solution {
public:
  //找左右两边比他大的连续的
    int largestRectangleArea(vector<int>& heights){
        stack<int> stk;
        int len=heights.size();
        vector<int> l(len,0),r(len,len-1);
        for(int i=0;i<heights.size();i++){
            while(stk.size() && heights[i]<heights[stk.top()]){ //正常的应该是 <= 的时候pop但是我们这个不是要保证单调,而是要求出左右边界,所以我们使用<的时候pop
                r[stk.top()]=i-1; //所以离开的时候,就是可以判断  剩下没有被赶走的就是len-1了
                stk.pop(); 
            }
            stk.push(i);
        }
        stack<int> stk1; //清空一个栈,不如新建一个
        for(int i=len-1;i>=0;i--){
            while(stk1.size() && heights[i]<heights[stk1.top()]){
                l[stk1.top()]=i+1; //所以离开的时候,就是可以判断  剩下没有被赶走的就是0了
                stk1.pop();
            }
            stk1.push(i);
        } 
        int ans=0;
        for(int i=0;i<len;i++){
            ans=max(ans,(r[i]-l[i]+1)*heights[i]);
        }
        return ans;
    }
};

//给两个测试用例
//[2,1,5,6,2,3,2]  
//[2,1,5,6,2,3,3,3,2]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值