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.
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
.
解题思路:
这道题算是让我弄了很久,一直都是超时。后面解出来也是借鉴了别人的想法。
大致的思路就是:用一个stack来存储下标。当一个数值(设下标为c)比stack的栈顶下标对应的值(a1)小的时候,说明a1没法到达目前的下标,所以就把栈顶弹出。然后再获得下一个栈顶值。该栈顶值到c之间的距离就是a1所能覆盖的长方形的宽。不断循环下去直到stack为空或者栈顶下标对应的值小于等于当前值。这样不断循环下去就可以了。(感觉好难解释....)
public class Solution {
public int largestRectangleArea(int[] heights) {
Stack<Integer> indexstack = new Stack<>();
int result = 0;
int length = heights.length;
for(int i = 0;i<length;i++)
{
while(!indexstack.empty() && heights[indexstack.peek()]>heights[i])
{
int height = heights[indexstack.pop()];
if(!indexstack.empty())
result = Math.max(result, height*(i-indexstack.peek()-1));
else
result = Math.max(result, height*i);
}
if(indexstack.empty() || heights[indexstack.peek()]<=heights[i])
indexstack.push(i);
}
while(!indexstack.empty())
{
int height = heights[indexstack.pop()];
if(!indexstack.empty())
result = Math.max(result, height*(length-indexstack.peek()-1));
else
result = Math.max(result, height*length);
}
return result;
}
}