Largest Rectangle in Histogram
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.
Example:
Input: [2,1,5,6,2,3]
Output: 10
解法1
在每个局部峰值的时候往前遍历所有的可能的矩阵大小,找到最大的。
局部峰值的意思就是当前值比下一个值大,比如例子中的2,6,3。
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int len = heights.size();
if (len == 0)
return 0;
int max_value = 0;
for(int i=0;i<len;i++){
if(i==len-1 || heights[i]>heights[i+1]){
int min_value = INT_MAX;
for(int j=i;j>=0;j--){
min_value = min(min_value, heights[j]);
max_value = max(max_value, min_value*(i-j+1));
}
}
}
return max_value;
}
};
解法2:单调栈
维护一个单调递增的栈,保存单调递增的高度的下标,便于计算间隔。
在heights的末尾加上一个0,便于处理最后一个高度值。
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int len = heights.size();
if (len == 0)
return 0;
int max_value = 0;
stack<int> index;
heights.push_back(0);
for(int i=0;i<=len;i++){
if(index.empty() || heights[i] >= heights[index.top()])
index.push(i);
else{
while(!index.empty() && heights[index.top()] > heights[i]){
int cur = index.top();
index.pop();
max_value = max(max_value, heights[cur]*(index.empty() ? i : i-index.top()-1));
}
index.push(i);
}
}
return max_value;
}
};