leetcode-Largest Rectangle in Histogram

 1 #include <iostream>
 2 #include <stack>
 3 #include <vector>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 class Solution2
 8 {
 9 public:
10     int largestRectangleArea(vector<int> &height) {
11         height.push_back(0);
12         int i = 0;
13         int result = 0;
14         stack<int> s;
15         while (i < height.size())
16         {
17             if (s.empty() || height[i]>height[s.top()])
18                 s.push(i++);
19             else
20                 //已经发现下标[i]的元素比栈顶元素(也就是下标[i-1]的元素)小了,所以栈顶元素(即[i-1]号)无法向右延伸了。
21                 //因此可以将其弹出了,并计算向左能延伸多远。
22                 
23             {
24                 int tmp = s.top();
25                 s.pop();
26                 result = max(result, height[tmp] * (s.empty() ? i:i-s.top()-1));
27             }
28         }
29         return result;
30     }
31 };
32 
33 
34 
35 
36 
37 class Solution {
38 public:
39     int largestRectangleArea(vector<int> &height) {
40         stack<int> s;
41         height.push_back(0);//将0硬插入数组作为最后一个直方图高度值,从而在i遍历到最后时能把栈中剩余的元素全弹出来。
42         int result = 0;
43         for (int i = 0; i < height.size();) {
44 
45             //只有i所遍历到的元素大于栈顶元素时才能入栈,相等都不行,以保证当前的栈顶元素是独一无二的孤峰,【直接相邻的】左右元素都比它小,这样它就没法左右延伸了
46             //每次都是针对出栈的栈顶元素,看该元素对应的直方柱能左右延伸多远、最大构成多大的矩阵。
47             if (s.empty() || height[i] > height[s.top()])//这里是将i所指的值与栈顶元素比,不是与直接相邻的上一个元素比。
48                 s.push(i++);
49             else {
50                 int tmp = s.top();
51                 s.pop();
52                 //(1)要想通一点:站在当前处理的元素的角度来看,对于那些之前入过栈又跳出去的元素,肯定都是比自己值大的。
53                 //(2)栈中元素都是单调递增的。
54                 //(3)当向右没法延伸时(i所指元素不再大于当前栈顶元素)就开始出栈,并通过【i-s.top()-1】得出向左延伸时能延伸多远(s.top()即向左延伸时第一个比自己值小的立柱的x坐标。比自己值大的不可能还在栈内。)
55                 //从而计算当前出栈元素所能参与构成的最大矩阵。
56                 //(4)i-1所指的元素必定是当前的栈顶元素
57                 result = max(result, height[tmp] * (s.empty() ? i : i - s.top() - 1));
58             }
59         }
60         return result;
61     }
62 };
63 int main()
64 {
65     Solution s;
66     int a[] = { 1, 2, 4, 3, 2, 4 };
67     vector<int> v(a, a + 6);
68     cout << s.largestRectangleArea(v) << endl;
69     return 0;
70 }

 

posted @ 2014-10-12 22:28  Ryan in C++  阅读(193)  评论(0编辑  收藏  举报