Largest Rectangle in Histogram Total Accepted: 14600 Total Submissions: 69120 My Submissions
Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.
Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3]
.
The largest rectangle is shown in the shaded area, which has area = 10
unit.
For example,
Given height = [2,1,5,6,2,3]
,
return 10
.
class Solution {
int maximalRectangleInHistogram(vector<int> &histogram) {
stack<pair<int, int> > buffer;
const int n = histogram.size();
int ans = 0;
buffer.push(make_pair(histogram[0], 1));
for (int i = 1; i < n; ++i) {
if (histogram[i] > buffer.top().first) {
buffer.push(make_pair(histogram[i], 1));
}
else if (histogram[i] == buffer.top().first) {
int cnt = buffer.top().second;
buffer.pop();
buffer.push(make_pair(histogram[i], cnt + 1));
}
else {
int cnt = 0;
while (buffer.size() > 0) {
if (buffer.top().first < histogram[i]) break;
cnt += buffer.top().second;
ans = max(ans, buffer.top().first * cnt);
buffer.pop();
}
buffer.push(make_pair(histogram[i], cnt + 1));
}
}
while (buffer.size() > 0) {
ans = max(ans, buffer.top().first * buffer.top().second);
int cnt = buffer.top().second;
buffer.pop();
if (buffer.size() > 0) {
pair<int, int> tmp = buffer.top();
buffer.pop();
buffer.push(make_pair(tmp.first, tmp.second + cnt));
}
}
return ans;
}
public:
int largestRectangleArea(vector<int> &height) {
if (height.size() == 0) return 0;
return maximalRectangleInHistogram(height);
}
};