|
19 | 19 | 输出: 10
|
20 | 20 | ```
|
21 | 21 |
|
22 |
| -### 解法 |
| 22 | +### 解法1 |
23 | 23 | 从前往后遍历 heightss[0...n]:
|
24 | 24 |
|
25 | 25 | - 若 heightss[i] > heightss[i - 1],则将 i 压入栈中;
|
26 | 26 | - 若 heightss[i] <= heightss[i - 1],则依次弹出栈,计算栈中能得到的最大矩形面积。
|
27 | 27 |
|
28 | 28 | 注意,压入栈中的是柱子的索引,而非柱子的高度。(通过索引可以获得高度、距离差)
|
29 | 29 |
|
| 30 | +### 解法2:构建升序栈 |
| 31 | + |
| 32 | +[见原文(方法二)](https://blog.csdn.net/jingsuwen1/article/details/51577983) |
| 33 | + |
| 34 | +**1、如果已知height数组是升序的,应该怎么做?** |
| 35 | + |
| 36 | +>比如1,2,5,7,8 |
| 37 | +> |
| 38 | +>那么就是(1\*5) vs. (2\*4) vs. (5\*3) vs. (7\*2) vs. (8\*1) |
| 39 | +> |
| 40 | +>也就是max(height[i]*(size-i)) |
| 41 | +
|
| 42 | + |
| 43 | +**2、使用栈的目的就是构造这样的升序序列,按照以上方法求解。** |
| 44 | + |
| 45 | + |
| 46 | +>但是height本身不一定是升序的,应该怎样构建栈? |
| 47 | +> |
| 48 | +>比如2,1,5,6,2,3 |
| 49 | +> |
| 50 | +>(1)2进栈。s={2}, result = 0 |
| 51 | +> |
| 52 | +>(2)1比2小,不满足升序条件,因此将2弹出,并记录当前结果为2*1=2。 |
| 53 | +> |
| 54 | +>将2替换为1重新进栈。s={1,1}, result = 2 |
| 55 | +> |
| 56 | +>(3)5比1大,满足升序条件,进栈。s={1,1,5},result = 2 |
| 57 | +> |
| 58 | +>(4)6比5大,满足升序条件,进栈。s={1,1,5,6},result = 2 |
| 59 | +> |
| 60 | +>(5)2比6小,不满足升序条件,因此将6弹出,并记录当前结果为6*1=6。s={1,1,5},result = 6 |
| 61 | +> |
| 62 | +> 2比5小,不满足升序条件,因此将5弹出,并记录当前结果为5*2=10(因为已经弹出的5,6是升序的)。s={1,1},result = 10 |
| 63 | +> |
| 64 | +> 2比1大,将弹出的5,6替换为2重新进栈。s={1,1,2,2,2},result = 10 |
| 65 | +> |
| 66 | +>(6)3比2大,满足升序条件,进栈。s={1,1,2,2,2,3},result = 10 |
| 67 | +> |
| 68 | +>栈构建完成,满足升序条件,因此按照升序处理办法得到上述的max(height[i]\*(size-i))=max{3\*1, 2\*2,2\*3, 2\*4, 1\*5, 1\*6}=8<10 |
| 69 | +> |
| 70 | +>综上所述,result=10 |
| 71 | +
|
| 72 | +------------------------------ |
| 73 | +### JAVA(解法1) |
| 74 | + |
30 | 75 | ```java
|
31 | 76 | class Solution {
|
32 | 77 | public int largestRectangleArea(int[] heights) {
|
@@ -64,4 +109,51 @@ class Solution {
|
64 | 109 |
|
65 | 110 | }
|
66 | 111 | }
|
| 112 | +``` |
| 113 | + |
| 114 | +### CPP(解法2) |
| 115 | + |
| 116 | +```CPP |
| 117 | +class Solution { |
| 118 | +public: |
| 119 | + int largestRectangleArea(vector<int>& heights) { |
| 120 | + if(heights.empty())return 0; |
| 121 | + int len = heights.size(); |
| 122 | + |
| 123 | + stack<int> s_stack; |
| 124 | + int ans = 0; |
| 125 | + |
| 126 | + for(int i = 0;i < len;i++){ |
| 127 | + if(s_stack.empty() || heights[i] >= s_stack.top()) |
| 128 | + {//满足升序条件 |
| 129 | + s_stack.push(heights[i]); |
| 130 | + } |
| 131 | + else |
| 132 | + {//不满足升序 |
| 133 | + int count = 0; |
| 134 | + while(!s_stack.empty() && s_stack.top() > heights[i]) |
| 135 | + { |
| 136 | + count++; |
| 137 | + ans = max(ans,s_stack.top() * count); |
| 138 | + s_stack.pop(); |
| 139 | + } |
| 140 | + while(count > 0) |
| 141 | + { |
| 142 | + s_stack.push(heights[i]); |
| 143 | + count--; |
| 144 | + } |
| 145 | + s_stack.push(heights[i]); |
| 146 | + } |
| 147 | + } |
| 148 | + |
| 149 | + int count = 1; |
| 150 | + while(!s_stack.empty()){ |
| 151 | + ans = max(ans,s_stack.top() * count); |
| 152 | + s_stack.pop(); |
| 153 | + count++; |
| 154 | + } |
| 155 | + |
| 156 | + return ans; |
| 157 | + } |
| 158 | +}; |
67 | 159 | ```
|
0 commit comments