zoukankan      html  css  js  c++  java
  • 柱状图的最大矩形--单调栈

     

    思路:从左往右遍历一遍高度值,在[ 0 , i ]范围内,求以height[ i ]为高度值能取的最大面积,不断更新这个最大面积即为最终结果

    以某个柱子作为高度的最大面积如何求?------------------>单调递增栈

    举个例子:给定柱子的高度分别为2   1   5   6   2   3

    下标在[0,2]的范围内,以5为高的最大面积为5*1            此时维持的单调栈为( 1 )   1是比5小的第一个元素所在的下标         Area=5*(2-1)

    更新完最大面积之后,元素5所在的下标2入栈,此时单调栈的元素为(1,2)

    //单调栈(递增)求柱状图最大面积
    int largestRectangleArea(vector<int>& heights) {
        //每个柱子的高度
        heights.push_back(0);
        //单调递增的一个栈,栈保存得是当前柱子高度所在得下标
        stack<int> stk;
        int maxArea = 0;
        for (int i = 0; i < heights.size(); i++)
        {
            //while循环维持单调栈的递增性质,
            while (!stk.empty() && heights[i] < heights[stk.top()])
            {
                int top = stk.top();
                stk.pop();
                //不断更新当前高度能取得最大值,面积=当前高度*(当前位置-第一个比当前高度小的柱子坐标)
                maxArea = max(maxArea, heights[top] * (stk.empty() ? i : (i - stk.top() - 1)));
            }
            stk.push(i);
        }
        return maxArea;
    }

                

  • 相关阅读:
    记录一下
    Fiddler对谷歌浏览器抓包
    Linux环境部署基本步骤
    JS----this && JS继承
    节流与防抖
    JS---call apply bind的区别&&JS---argument
    浏览器输入url之后到最后网页渲染出来经历了什么
    Bom中的方法
    JS----new和object.create的区别
    有关排序
  • 原文地址:https://www.cnblogs.com/-citywall123/p/13410852.html
Copyright © 2011-2022 走看看