[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 };
posted @ 2014-07-20 12:17  Marrybe  阅读(136)  评论(0编辑  收藏  举报