zoukankan      html  css  js  c++  java
  • [LeetCode] Largest Rectangle in Histogram

    第一种方法,暴力求解,从当前向左右两个方向扫描比自己小的,然后计算面积,时间复杂度O(n^2)code如下,但是在LeetCode上回超时。

     1 class Solution {
     2 public:
     3     int largestRectangleArea(vector<int> &height) {
     4         
     5         int size = height.size();
     6         int left = 0, right = 0, area = 0;
     7         
     8         for(int i = 0; i < size; i++)
     9         {
    10             int j;
    11             for( j = i-1; j>= 0;j--)
    12             {
    13                 if(height[j] <height[i])
    14                 {
    15                     left = j;
    16                     break;
    17                 }
    18             }
    19             
    20             for(j = i+1; j<size; j++)
    21             {
    22                 if(height[j] <height[i])
    23                 {
    24                     right = j;
    25                     break;
    26                 }
    27             }
    28             
    29             area = max(area, height[i] * (right - left -1));
    30         }
    31         
    32         return area;
    33         
    34     }
    35 };

    第二种方法,对于每一个height[i],第一种方法用暴力查找的方法找它的左右边界,我们可以用一个stack来实现其左右边界的查找。我们维持一个递增的栈,由于是递增的,后压入栈的都比前面的大,所以其左边界就确定了,我们要做的是找右边界。当某一个height[j]小于当前栈顶元素时,就找到了右边界,则将计算以当前栈顶元素计算为高得面积;如果下一个栈顶元素还是大于height[j],则仍要计算面积,以此类推,知道最后,我们一下图举例。

    对原有的height在末尾压入0.

    初始,stack为空,

    i = 0, push idx=0 into stack;

    i = 1, height[1] = 7 > height[stack.top()] = 2, push idx=1 into stack;

    i = 2, height[2] = 5 < height[stack.top()] = 7,pop idx=2 from stack, calc area = (i-stack.top()-1)*height[idx] = (2-0-1)*7=7;

         height[2] = 5 > height[stack.top()] = 2, stop to calc area and push 5 into stack.

    i = 3, height[3] = 6 > height[stack.top()] = 5, push idx = 3 into stack;

    i = 4, height[4] = 4 < height[stack.top()] = 6, pop idx = 3 from stack, calc area = (i-stack.top()-1)*height[idx]= (4-2-1)*6=6,

       height[4] = 4 < height[stack.top()] = 5, pop idx =2 from stack, calc area =(i-stack.top()-1)*height[idx]=(4-0-1)*5=15,

       height[4] = 4 > height[stack.top()] = 2, push idx= 4 into stack;

    i = 5 height[5] = 0 < height[stack.top()] = 2, pop idx =0 form stack, calc area = i*height[idx]= 5 * 2 = 10;

    所以最大面积为15.

     1 class Solution {
     2 public:
     3     int largestRectangleArea(vector<int> &height) {
     4       
     5         //add 0 to the end
     6         height.push_back(0);
     7         
     8         int size = height.size(); //this new_size is 1 + old_size
     9         stack<int> st;
    10         
    11         int max_area = 0;
    12         
    13 
    14         
    15         for(int i = 0; i< size; )
    16         {
    17             if(st.empty() || height[i] > height[st.top()])
    18             {
    19                 st.push(i);
    20                 i++;
    21             }
    22             else
    23             {
    24                 //st must be not empty here
    25                 // i can't ++; handle many times perhaps
    26                 
    27                 int idx = st.top();
    28                 st.pop();
    29                 
    30                 int area;
    31                 
    32                 if(st.empty())
    33                 {
    34                     area = height[idx] * i;
    35                 }
    36                 else
    37                 {
    38                     area = height[idx] * (i-st.top()-1);
    39                 }
    40                 
    41                 max_area = max(max_area, area);
    42 
    43             }
    44         }
    45         return max_area;
    46     }
    47 };
    48 f
  • 相关阅读:
    十五分钟建立精美网站
    WebMatrix教程(一) (关注Microsoft 的最新武器:建立你的第一个WebMatrix网站)
    数据同步框架MS Sync Framework IDE快速开发支持Local Database Cache
    Interview SeniorSoftwareEngineers
    学JQuery最新免费教程[转]
    Visual Studio 2010 支持HTML5 和 CSS3
    Orchard:打包和共享模块
    CSLA.NET 框架开发实战
    如何真正提高ASP.NET网站的性能
    敏捷英语
  • 原文地址:https://www.cnblogs.com/diegodu/p/3775782.html
Copyright © 2011-2022 走看看