zoukankan      html  css  js  c++  java
  • [LeetCode OJ] 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.

    方法一:两层循环遍历,复杂度O(n2

     1 class Solution {
     2 public:
     3     int largestRectangleArea(vector<int> &height) {
     4         int maxArea=0;
     5         for(unsigned i=0; i<height.size(); i++)
     6         {
     7             int min = height[i];
     8             for(unsigned j=i; j<height.size(); j++)
     9             {
    10                 if(height[j]<min)
    11                     min = height[j];
    12                 int area = min*(j-i+1);
    13                 if(area>maxArea)
    14                     maxArea = area;
    15             }
    16         }
    17         return maxArea;
    18     }
    19 };

    方法二:用堆栈保存重要位置,复杂度O(n)

     1 class Solution {
     2 public:
     3     int largestRectangleArea(vector<int> &height) {  //用堆栈来实现
     4         stack<unsigned> st;
     5         unsigned maxArea = 0;
     6         for(unsigned i=0; i<height.size(); i++)
     7         {
     8             if(st.empty())
     9                 st.push(i);
    10             else
    11             {
    12                 while(!st.empty())
    13                 {
    14                     if(height[i]>=height[st.top()])
    15                     {
    16                         st.push(i);
    17                         break;
    18                     }
    19                     else
    20                     {
    21                         unsigned idx=st.top();
    22                         st.pop();
    23                         unsigned leftwidth = st.empty() ? idx : (idx-st.top()-1);
    24                         unsigned rightwidth = i - idx-1;
    25                         maxArea = max(maxArea, height[idx]*(leftwidth+rightwidth+1));
    26                     }
    27                 }
    28                 if(st.empty())
    29                     st.push(i);
    30             }
    31         }
    32         unsigned rightidx = height.size();
    33         while(!st.empty())
    34         {
    35             unsigned idx = st.top();
    36             st.pop();
    37             unsigned leftwidth = st.empty() ? idx : (idx-st.top()-1);
    38             unsigned rightwidth = rightidx - idx-1;
    39             maxArea = max(maxArea, height[idx]*(leftwidth+rightwidth+1));
    40         }
    41         return maxArea;
    42     }
    43 };
  • 相关阅读:
    Highways(prim)
    Help Me with the Game(模拟)
    Parencodings
    The Pilots Brothers' refrigerator
    解决Geany 编辑器无法导入matplotlib包问题
    解决pycharm中导入自定义模块提示出错问题
    解决Pycharm中单元测试未发现问题(No tests were found)
    matplotlib设置中文的的一种方式
    matplotlib入门
    matplotlib入门
  • 原文地址:https://www.cnblogs.com/Marrybe/p/3856070.html
Copyright © 2011-2022 走看看