zoukankan      html  css  js  c++  java
  • LeetCode 84. Largest Rectangle in Histogram

    题目

    单调栈。

    如果用O(n^2)的算法,必定超时。

    所以我们可以用单调栈,来实现O(n)效率的算法。

    单调栈是递增的,每个长方形入栈时,都和栈顶的长方形高度对比,如果大于,则入栈。如果小于则按照高度合并长方形,直到比它高度小的元素,然后再进栈。

    最后挨个出栈。

    而出栈的过程才是真正计算长方形面积的过程。一个单调递增的栈,可以以O(1)的效率出栈,以O(n)效率,比较所有可能的组合情况,找出最大值。

    所以关键就在单调栈这个思路

    struct Node
    {
        int h;
        int w;
        Node(){}
        Node(int h,int w)
        {
            this->h=h;
            this->w=w;
        }
    }s[100005];
    
    class Solution {
    public:
       
        int pos;
        int largestRectangleArea(vector<int>& heights) {
            
            if(heights.size()==0)
                return 0;
            
            pos=0;
            int res=heights[0];
            
            s[0]=Node(heights[0],1);
            
            for(int i=1;i<heights.size();i++)
            {
                if(heights[i]>s[pos].h)
                {
                    s[++pos]=Node(heights[i],1);
                }
                else
                {
                    int num=0;
                    while(pos!=-1&&heights[i]<=s[pos].h)
                    {
                        num+=s[pos].w;
                        res=max(res,s[pos].h*num);
                        pos--;
                    }
                    
                    s[++pos]=Node(heights[i],num+1);
                }
            }
            
            int num=0;
            while(pos!=-1)
            {
                num+=s[pos].w;
                res=max(res,s[pos].h*num);
                pos--;
            }
            
            return res;
            
        }
    };
    
  • 相关阅读:
    HTML5和CSS3的学习视频
    webpack中bundler源码编写2
    webpack中bundler源码编写
    webpack中如何编写一个plugin
    webpack多页面打包配置
    webpack中配置eslint
    webpack解决单页面路由问题
    webpack中使用WebpackDevServer实现请求转发
    webpack中typeScript的打包配置
    rsync 同步
  • 原文地址:https://www.cnblogs.com/dacc123/p/11866239.html
Copyright © 2011-2022 走看看