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

    Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.

    Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3].

    The largest rectangle is shown in the shaded area, which has area = 10 unit.

    For example,
    Given height = [2,1,5,6,2,3],
    return 10.

     辅助栈:方法1(扫描3遍)

     1 class Solution {
     2 public:
     3     int largestRectangleArea(vector<int> &height) {
     4         // Start typing your C/C++ solution below
     5         // DO NOT write int main() function
     6         vector<int> area(height.size());
     7         
     8         stack<int> s;
     9         for(int i = 0; i < height.size(); i++)
    10             if (s.empty())
    11             {
    12                 s.push(i);
    13                 area[i] = 0;
    14             }
    15             else
    16             {
    17                 while(!s.empty())
    18                 {
    19                     if (height[i] <= height[s.top()])
    20                     {
    21                         s.pop();
    22                     }
    23                     else
    24                         break;
    25                 }
    26                 
    27                 if (s.empty())
    28                     area[i] = i;
    29                 else
    30                     area[i] = i - s.top() - 1;
    31                 s.push(i);    
    32             }
    33         
    34         while(!s.empty())
    35             s.pop();
    36             
    37         for(int i = height.size() - 1; i >= 0; i--)
    38             if (s.empty())
    39             {
    40                 s.push(i);
    41                 area[i] += 0;
    42             }
    43             else
    44             {
    45                 while(!s.empty())
    46                 {
    47                     if (height[i] <= height[s.top()])
    48                     {
    49                         s.pop();
    50                     }
    51                     else
    52                         break;
    53                 }
    54                 
    55                 if (s.empty())
    56                     area[i] += height.size() - i - 1;
    57                 else
    58                     area[i] += s.top() - i - 1;
    59                 s.push(i);
    60             }
    61             
    62         int maxArea = 0;
    63         for(int i = 0; i < area.size(); i++)
    64         {
    65             maxArea = max(maxArea, height[i] * (area[i] + 1));
    66         }
    67         
    68         return maxArea;
    69     }
    70 };

     辅助栈:方法3

     1 class Solution {
     2 public:
     3     int largestRectangleArea(vector<int> &height) {
     4         // Start typing your C/C++ solution below
     5         // DO NOT write int main() function
     6         int maxArea = 0;
     7         stack<int> s;
     8         
     9         for(int i = 0; i < height.size(); i++)
    10             if (s.empty())
    11             {
    12                 s.push(i);
    13             }
    14             else
    15             {
    16                 while(!s.empty())
    17                 {
    18                     if (height[s.top()] <= height[i])
    19                     {
    20                         s.push(i);
    21                         break;
    22                     }
    23                     else
    24                     {
    25                         int index = s.top();
    26                         s.pop();
    27                         int leftWidth = s.empty() ? index : index - s.top() - 1;
    28                         int rightWidth = i - index - 1;
    29                         maxArea = max(maxArea, height[index] * (leftWidth + rightWidth + 1));
    30                     }
    31                 }
    32                 
    33                 if (s.empty())
    34                     s.push(i);
    35             }
    36         
    37         int rightIndex = s.empty() ? 0 : s.top() + 1;
    38         
    39         while(!s.empty())
    40         {
    41             int index = s.top();
    42             s.pop();
    43             int leftWidth = s.empty() ? index : index - s.top() - 1;
    44             int rightWidth = rightIndex - index - 1;
    45             maxArea = max(maxArea, height[index] * (leftWidth + rightWidth + 1));
    46         }
    47         
    48             
    49         return maxArea;
    50     }
    51 };

    用辅助栈:方法2(扫描一遍)

     1 struct Node
     2 {
     3     int val;
     4     int index;
     5     int area;
     6     Node(){}
     7     Node(int v, int idx):val(v), index(idx){}
     8 };
     9 
    10 class Solution {
    11 public:
    12     int largestRectangleArea(vector<int> &height) {
    13         // Start typing your C/C++ solution below
    14         // DO NOT write int main() function
    15         stack<Node> s;
    16         int maxArea = 0;
    17         for(int i = 0; i < height.size(); i++)
    18             if (s.empty())
    19                 s.push(Node(height[i], i));
    20             else
    21             {
    22                 while(!s.empty())
    23                 {
    24                     Node node = s.top();
    25                     if (node.val <= height[i])
    26                     {
    27                         s.push(Node(height[i], i));
    28                         break;
    29                     }
    30                     else
    31                     {
    32                         s.pop();
    33                         int leftIndex = s.empty() ? 0 : s.top().index + 1;                      
    34                         maxArea = max(maxArea, (i - node.index + node.index - leftIndex) * node.val);                       
    35                     }
    36                 }
    37                 
    38                 if (s.empty())
    39                     s.push(Node(height[i], i));
    40             }
    41             
    42         int index = height.size();
    43         while(!s.empty())
    44         {
    45             Node node = s.top();
    46             s.pop();
    47             int leftIndex = s.empty() ? 0 : s.top().index + 1;
    48             maxArea = max(maxArea, (index - node.index + node.index - leftIndex) * node.val);
    49         }
    50         
    51         return maxArea;
    52     }
    53 };
  • 相关阅读:
    RegularExpressions(正则表达式)
    IntelliJ Idea工具使用
    JavaScript总结
    Ajax技术基础
    配置Nginx作为反向代理服务器
    SpringBoot下的Dubbo和Zookeeper整合
    springSecurity初识练气初期
    Spring Security拦截器加载流程分析练气中期
    Spring Security认证流程分析练气后期
    springBoot整合spring security+JWT实现单点登录与权限管理前后端分离筑基中期
  • 原文地址:https://www.cnblogs.com/chkkch/p/2787359.html
Copyright © 2011-2022 走看看