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 }