Largest Rectangle in Histogram
This is a useful problem, the same techniques can also be used to calculate Maximal Rectangle/Square.
The idea is to use a stack and let the stack keep indexes of a series of increasing
height in the array. Let's we get position i
now, if height[i]
is greater than
height[stack.peek()]
we just push it into the stack. Or, we pop one element from the stack if
there is any and get the height h
. At this point, we know, every heights from the one after new peek of stack to
the item before i
are all greater or equal to h
. So we can get a rectangle with h
as height and
i - stack.peek() - 1
as width. If stack is empty, we let the peek to be -1
.
public class LargestRectangleInHistogram {
public int largestRectangleArea(int[] height) {
Stack<Integer> stack = new Stack<Integer>();
int max = 0;
for (int i = 0; i < height.length; i++) {
while (!stack.isEmpty() && height[stack.peek()] >= height[i]) {
int h = height[stack.pop()];
int l = (stack.isEmpty() ? -1 : stack.peek());
max = Math.max(max, h * (i - l - 1));
}
stack.push(i);
}
while (!stack.isEmpty()) {
int h = height[stack.pop()];
int l = (stack.isEmpty() ? -1 : stack.peek());
max = Math.max(max, h * (height.length - l - 1));
}
return max;
}
}
As every index will be push into and pop out of the stack once, this algorithm cost time, and in the worst case it may cost space.