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 }