-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path85. Maximal Rectangle.cpp
46 lines (39 loc) · 1.16 KB
/
85. Maximal Rectangle.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/*
9:21 - 9:31
Just transfer this problem to 84 by sum previous 1 number.
WA for this case [["0","1"],["1","0"]]
*/
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
heights.push_back(0);
reverse(heights.begin(),heights.end());
heights.push_back(0);
int n = heights.size();
vector<int>maxH,leftW(n,1),rightW(n,1);
maxH.push_back(0);
for(int i=1;i<n;i++) {
while(maxH.size()&&heights[maxH.back()]>=heights[i])
maxH.pop_back();
if(maxH.size())
leftW[i]=i-maxH.back();
maxH.push_back(i);
}
reverse(heights.begin(),heights.end());
maxH.clear();
maxH.push_back(0);
for(int i=1;i<n;i++) {
while(maxH.size()&&heights[maxH.back()]>=heights[i])
maxH.pop_back();
if(maxH.size())
rightW[i]=i-maxH.back();
maxH.push_back(i);
}
reverse(leftW.begin(),leftW.end());
int ans = 0;
for(int i=1;i<n;i++){
ans = max(ans,heights[i]*(rightW[i]+leftW[i]-1));
}
return ans;
}
};