题目
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.
分析
1.第一种想法:遍历每一个柱子,并向左向右扫描高度大于等于该柱的连续柱子个数,计算面积。遍历过后最大的面积即为解。
2.第二种想法:考虑遍历一次,并记住可能为最大值的有限解,遍历时不断更新。
第一种方法:O(n^2)
class Solution {
public:
int largestRectangleArea(vector<int> &height) {
if (height.empty())
return 0;
int maxValue = 0;
for (int index = 0; index < height.size(); index++) {
int tempLeft = index;
while (tempLeft >= 0 && height[tempLeft] >= height[index])
tempLeft--;
int tempRight = index;
while (tempRight < height.size() && height[tempRight] >= height[index])
tempRight++;
int Area = (tempRight - tempLeft - 1) * height[index];
if (Area > maxValue)
maxValue = Area;
}
return maxValue;
}
};
第二种方法O(n)
class Solution {
public:
int largestRectangleArea(vector<int> &height) {
if (height.empty())
return 0;
int maxValue = 0;
stack<int> stackRectangle;
height.push_back(0);
for (int index = 0; index < height.size(); index++) {
if (stackRectangle.empty() || height[stackRectangle.top()] < height[index]) {
stackRectangle.push(index);
} else {
int temp = stackRectangle.top();
stackRectangle.pop();
maxValue = max(maxValue, height[temp] * (stackRectangle.empty() ?
index : index - stackRectangle.top() - 1));
index--;
}
}
height.pop_back();
return maxValue;
}
};
上面这种方法很有技巧性:
1. 栈存放存放索引值,索引值的差作为宽度。
2. 直方图递增时不断压栈。
3. 遍历直方图递减时出栈。求出前面的高度高于它的最大面积值。
4. 尾部放置哨兵使逻辑终止,避免尾部判断。