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
.
暴力法会超时,参考别人的方法用stack的方法做http://www.cnblogs.com/TenosDoIt/p/3454634.html。
Source
public class Solution {
public int largestRectangleArea(int[] height) {
Stack<Integer> stack = new Stack<Integer>();
int i = 0, max = 0;
int[] hei = new int[height.length + 1];
hei = Arrays.copyOf(height, hei.length); //copyOf是将height数组中的值赋值给hei,长度超过height的补0
while(i < hei.length){
if(stack.isEmpty() || hei[stack.peek()] <= hei[i]) //stack栈顶元素小于数组中当前值时数组序列入栈
stack.push(i++); //只有数组里的数递增的时候才入栈 将序列i入栈
else{
int temp = stack.pop(); //当遇到第一个非递增的数时出栈一直出到栈中值小于等于当前值
max = Math.max(max, hei[temp] * (stack.isEmpty() ? i : i - stack.peek() - 1));
//由于push里面写的是i++ 所以此时i为pop的数的下一个位置,peek为pop的前一个位置,所以需要多-1
}
}
return max;
}
}
Test
public static void main(String[] args){
int[] height = {2, 1, 5, 6, 2, 3};
System.out.println(new Solution().largestRectangleArea(height));
}