题目链接:https://leetcode.com/problems/largest-rectangle-in-histogram/
思路:
方法一:用单调栈来做,最开始做时,思路确实不太好想。
分享一位大佬有关单调栈的总结:单调栈
AC 15ms Java:
class Solution {
public int largestRectangleArea(int[] heights) {
int maxArea=0;
Stack<Integer> sk=new Stack();
for(int i=0;i<=heights.length;i++){
int h=(i==heights.length)?0:heights[i];
if(sk.isEmpty()||h>=heights[sk.peek()])
sk.push(i);
else{
int top=sk.pop();
maxArea=Math.max(maxArea,heights[top]*(sk.isEmpty()?i:i-1-sk.peek()));
i--;
}
}
return maxArea;
}
}
方法二:比较好理解的方式
对于每个下标i,都从后向前遍历,保存 j~i中的最小值,同时更新该区间的最大面积。
选择了一种优化策略,若array[i]<=array[i+1],那么在此局部递增的区间可以选择通过一次for(j~0)
来减少重复迭代次数。
如 ;【4,5,6,6,7,8,9】
这种情况下可以直接从9对应的下标处向前迭代寻找最大面积。
AC 3ms 93% Java:
class Solution {
public int largestRectangleArea(int[] heights) {
int maxArea=0;
int[] array=new int[heights.length+1];
for(int i=0;i<heights.length;i++){
array[i]=heights[i];
}
for(int i=0;i<array.length-1;i++){
if(array[i]<=array[i+1])
continue;
int low=array[i];
for(int j=i;j>=0;j--){
low=Math.min(low,array[j]);
int area=low*(i-j+1);
maxArea=Math.max(maxArea,area);
}
}
return maxArea;
}
}