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.
算法核心是:一次性计算连续递增的区间的最大面积,并且考虑完成这个区间之后,考虑其前、后区间的时候,不会受到任何影响。也就是这个连续递增区间的最小高度大于等于其前、后区间。
这个方法需要使用两个栈。第一个栈为高度栈h,用于记录还没有被计算过的连续递增的序列的值。第二个栈为下标栈index,用于记录高度栈中对应的每一个高度的下标,以计算宽度。
算法具体执行的步骤为:
若h为空或者当前高度大于h栈顶,则当前高度和当前下标分别入站。所以h记录了一个连续递增的序列。
若当前高度小于h栈顶,h和index出栈,直到当前高度大于等于h栈顶。出栈时,同时计算区间所形成的最大面积。
public int largestRectangleArea(int[] height) {
if(height == null || height.length == 0) return 0;
if(height.length == 1) return height[0];
int l = height.length;
LinkedList<Integer> index = new LinkedList<Integer>();
LinkedList<Integer> h = new LinkedList<Integer>();
int max = 0;
for(int i = 0;i < l;i++){
if(index.isEmpty() || h.peek() <= height[i]){
index.push(i);
h.push(height[i]);
}
else{
int j = 0;
while(!index.isEmpty() && height[i] < h.peek()){
j = index.peek();
int area = (i-index.pop())*h.pop();
max = Math.max(max,area);
}
index.push(j);
h.push(height[i]);
}
}
while(!index.isEmpty()){
int area = (l-index.pop())*h.pop();
max = Math.max(max,area);
}
return max;
}