zoukankan      html  css  js  c++  java
  • leetcode Largest Rectangle in Histogram 单调栈

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4052343.html

    题目链接 leetcode Largest Rectangle in Histogram 单调栈 

    对于每一个长条都向前找包含这个长条的最大面积使可行的,但是时间复杂度是O(n^2)大数据会超时。经过观察发现并不需要对每一个长条都向前查找,对于height[i],如果height[i+1]>height[i],那么就没有必要向前查找,原因是可以从height[i]查找到的最大面积向后延伸一格,那么一定大于当前所查找到的面积。因此我们维护一个单调递增栈(严格来说是单调非减),当发现当前的高度小于栈顶元素时,弹栈,并计算最大面积,直到栈顶元素小于当前的高度,把当前的高度压入栈中。

    需要注意的有一下几点:

    1.不要忘记最扁的长方形面积,实现方法是在height中push_back一个高度为0的长条。这样不会影响最终结果而且可以保证最后一次计算把栈弹空。

    2.如果height[i] == height[i+1]时,我们仍然可以把height[i]向后延伸,因此并不弹出height[i],直接压入height[i+1]。

    3.在弹出若干个height小于height[i]元素后,当把height压入栈中的时候,并不是把i当做index压入,而是把最后一个被弹出的index压入,因为在下一次计算面积时这些大于height[i]的长条已经不在栈中了,因此我们需要改变index。

    4.每次弹栈时,都要计算最大的面积。

    代码如下:

     1 class Solution {
     2 public:
     3 int largestRectangleArea(vector<int> &height) {
     4     height.push_back(0);
     5     stack<pair<int, int> > h;//height, index
     6     int res = 0;
     7     for( int i = 0 ; i < height.size() ; i++ )
     8     {
     9         pair<int, int> tmp;
    10         if( h.size() == 0 || h.top().first <= height[i])
    11         {
    12             h.push(make_pair(height[i], i));
    13         }
    14         else
    15         {
    16             while(h.size() > 0 && h.top().first > height[i])
    17             {
    18                 tmp = h.top();
    19                 h.pop(); 
    20                 res = max(res, tmp.first * (i-tmp.second));
    21             }
    22             h.push(make_pair(height[i], tmp.second));
    23         }
    24     }
    25     height.pop_back();
    26     return res;
    27 }
    28 };
    View Code
  • 相关阅读:
    CSS3实战手册(第3版)(影印版)
    21世纪C语言(影印版)
    Spring Data:企业级Java的现代数据访问技术(影印版)
    Hive编程(影印版)
    iOS 6编程Cookbook(影印版)
    做自己——鬼脚七自媒体第一季
    放飞App:移动产品经理实战指南
    《推荐系统》+《推荐系统实践》
    步步惊“芯”——软核处理器内部设计分析
    ip的划分,超详细
  • 原文地址:https://www.cnblogs.com/jostree/p/4052343.html
Copyright © 2011-2022 走看看