zoukankan      html  css  js  c++  java
  • 《84. 柱状图中最大的矩形》

    观察后可以发现,对于每个块成产生的以他为高的最大面积的宽度,就是左边第一个比他小的位置到它右边第一个比他小的位置。

    那么,我们可以用一个单调递增栈,在退栈时维护即可,显然退栈时栈顶和当前元素就是他左边第一个比他小的和右边第一个比他小的。

    然后为了不在特殊处理结束后没退栈的元素,我们在头尾插入两个0元素,这样就能保证所有元素都必定能找到左边和右边比他小的元素。

    class Solution {
    public:
        int largestRectangleArea(vector<int>& heights) {
            heights.push_back(0);
            heights.insert(heights.begin(),0);
            int N = 1e5+5,len = heights.size();
            long long ans = 0;
            int S[N],top = 0;//单调递增栈
            for(int i = 0;i < len;++i)
            {
                while(top != 0 && heights[i] < heights[S[top]])
                {
                    int dis = i-S[top-1]-1;
                    long long ma = (long long)dis*heights[S[top]];
                    if(ma > ans) ans = ma;
                    top--;
                }
                S[++top] = i;
            }
            return ans;
        }
    };
    View Code
  • 相关阅读:
    linux输入输出及vim管理
    Linux系统结构及常用命令
    Django
    python 基础
    python 路径
    初始化项目结构
    drf操作
    01.Django基础
    Oracle 中如何判断一个字符串是否为数字
    oracle管理权限与角色(篇1)
  • 原文地址:https://www.cnblogs.com/zwjzwj/p/13575917.html
Copyright © 2011-2022 走看看