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 {
public:
int largestRectangleArea(vector<int> &height) {
vector<int> expand(height.size());
stack<int> exstack;
// Get the expand from left to right.
for(int ii = 0; ii < height.size(); ii ++) {
if(exstack.empty()) {
expand[ii] = 0;
}
else {
while(!exstack.empty()) {
if(height[ii] <= height[exstack.top()]) {
exstack.pop();
}
else {
break;
}
}
if(exstack.empty()) {
expand[ii] = ii;
}
else {
expand[ii] = ii - exstack.top() - 1;
}
}
exstack.push(ii);
}
while(!exstack.empty())
exstack.pop();
// Get the expand from right to left.
for(int ii = height.size() - 1; ii >= 0; ii --) {
if(exstack.empty()) {
expand[ii] += 0;
}
else {
while(!exstack.empty()) {
if(height[exstack.top()] >= height[ii]) {
exstack.pop();
}
else {
break;
}
}
if(exstack.empty()) {
expand[ii] += height.size() - 1 - ii;
}
else {
expand[ii] += exstack.top() - 1 - ii;
}
}
exstack.push(ii);
}
// Get the max.
int maxval = 0;
for(int ii = 0; ii < height.size(); ii ++) {
maxval = max(maxval, height[ii] * (expand[ii] + 1));
}
return maxval;
}
};