Skip to content

Commit f8df84c

Browse files
authored
Create largest-rectangle-in-histogram.cpp
1 parent 434db7a commit f8df84c

File tree

1 file changed

+37
-0
lines changed

1 file changed

+37
-0
lines changed

largest-rectangle-in-histogram.cpp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
class Solution {
2+
public:
3+
int largestRectangleArea(vector<int>& heights) {
4+
5+
if (heights.empty()) {
6+
return 0;
7+
}
8+
9+
std::vector<std::pair<int,int>> vec;
10+
std::transform(heights.begin(),heights.end(), std::back_inserter(vec), [](int a) {return std::make_pair(a,-a);});
11+
12+
go(vec);
13+
std::reverse(vec.begin(),vec.end());
14+
go(vec);
15+
16+
return std::max_element(vec.begin(), vec.end(), [](auto a, auto b){return a.second < b.second;})->second;
17+
}
18+
19+
void go(std::vector<std::pair<int,int>>& vec) {
20+
std::stack<std::pair<int,int>> stk;
21+
stk.push(std::make_pair(-1,-1));
22+
23+
const int n = vec.size();
24+
25+
for (int i = 0; i < n; ++i) {
26+
while (stk.top().first >= vec[i].first) {
27+
stk.pop();
28+
}
29+
30+
assert(stk.size());
31+
32+
33+
vec[i].second += vec[i].first * (i - stk.top().second);
34+
stk.push({vec[i].first, i});
35+
}
36+
}
37+
};

0 commit comments

Comments
 (0)