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 };
  • 相关阅读:
    动态页面技术(JSP/EL/JSTL)
    JavaWeb核心之Servlet
    会话技术Cookie&Session
    待整理
    二进制中1的个数(python)
    矩形覆盖(python)
    变态跳台阶(python)
    跳台阶(python)
    斐波那契数列(python)
    旋转数组的最小数字(python/c++)
  • 原文地址:https://www.cnblogs.com/Marrybe/p/3856070.html
Copyright © 2011-2022 走看看