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 heights = [2,1,5,6,2,3]
,
return 10
.
分析:通过栈来实现,栈中存储的是数组下标,当当前元素的值大于栈顶对应元素的值时,将当前下标压栈;当当前元素的值小于其值时,将其弹出,并依次计算弹出的值对应的矩阵的最大值.然后将当前元素下标压栈.
<span style="font-size:14px;">public class Solution {
public int largestRectangleArea(int[] heights) {
Stack<Integer> stack=new Stack<Integer>();
int n=heights.length;
int max=0,temp;
for(int i=0;i<n;i++){
if(stack.isEmpty()||heights[i]>=heights[stack.peek()]){
stack.push(i);
}else{
while(!stack.isEmpty()&&heights[i]<heights[stack.peek()]){
temp=stack.pop();
if(!stack.isEmpty())
max=(i-stack.peek()-1)*heights[temp]>max?(i-stack.peek()-1)*heights[temp]:max;
else
max=i*heights[temp]>max?i*heights[temp]:max;
}
i--;
}
}
if(!stack.isEmpty()){
int index=stack.peek();
while(!stack.isEmpty()){
temp=stack.pop();
if(!stack.isEmpty())
max=(index-stack.peek())*heights[temp]>max?(index-stack.peek())*heights[temp]:max;
else
max=(index+1)*heights[temp]>max?(index+1)*heights[temp]:max;
}
}
return max;
}
}</span>