Skip to content

Commit 4fe43e6

Browse files
committed
Add Solution 084[CPP
1 parent fc562e9 commit 4fe43e6

File tree

2 files changed

+135
-1
lines changed

2 files changed

+135
-1
lines changed

solution/084.Largest Rectangle in Histogram/README.md

+93-1
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,59 @@
1919
输出: 10
2020
```
2121

22-
### 解法
22+
### 解法1
2323
从前往后遍历 heightss[0...n]
2424

2525
- 若 heightss[i] > heightss[i - 1],则将 i 压入栈中;
2626
- 若 heightss[i] <= heightss[i - 1],则依次弹出栈,计算栈中能得到的最大矩形面积。
2727

2828
注意,压入栈中的是柱子的索引,而非柱子的高度。(通过索引可以获得高度、距离差)
2929

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+
3075
```java
3176
class Solution {
3277
public int largestRectangleArea(int[] heights) {
@@ -64,4 +109,51 @@ class Solution {
64109

65110
}
66111
}
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+
};
67159
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
class Solution {
2+
public:
3+
int largestRectangleArea(vector<int>& heights) {
4+
if(heights.empty())return 0;
5+
int len = heights.size();
6+
7+
stack<int> s_stack;
8+
int ans = 0;
9+
10+
for(int i = 0;i < len;i++){
11+
if(s_stack.empty() || heights[i] >= s_stack.top())
12+
{//满足升序条件
13+
s_stack.push(heights[i]);
14+
}
15+
else
16+
{//不满足升序
17+
int count = 0;
18+
while(!s_stack.empty() && s_stack.top() > heights[i])
19+
{
20+
count++;
21+
ans = max(ans,s_stack.top() * count);
22+
s_stack.pop();
23+
}
24+
while(count > 0)
25+
{
26+
s_stack.push(heights[i]);
27+
count--;
28+
}
29+
s_stack.push(heights[i]);
30+
}
31+
}
32+
33+
int count = 1;
34+
while(!s_stack.empty()){
35+
ans = max(ans,s_stack.top() * count);
36+
s_stack.pop();
37+
count++;
38+
}
39+
40+
return ans;
41+
}
42+
};

0 commit comments

Comments
 (0)