输入:heights = [2,1,5,6,2,3] 输出:10 解释:最大的矩形为图中红色区域,面积为 10
输入: heights = [2,4] 输出: 4
这道题其实有一个隐含的条件,就是必然会以某一个heights[i]作为高
那么我们的大思路就是遍历一边整个heights数组,求得每个i位置的最大矩形,再用Math.max去PK,最后就能得到正确的答案
现在就差解决一个问题,那就是来到了i位置,怎么求得这个位置的最大矩形
矩形的计算公式是底*高,高我们已经知道了是heights[i],那么这个底我们怎么知道呢?
根据观察可以知道矩形的底取决于左边最近的比我当前位置小的i,右边最近的比我当前位置小的i
那这就是一个单调栈模型(单调栈大压小,如果小压大,就结算栈顶位置)
所以代码如下:
class Solution {
public int largestRectangleArea(int[] heights) {
Stack<Integer> stack = new Stack<>();
int ans =Integer.MIN_VALUE;
for(int i=0;i<heights.length;i++){
while(!stack.isEmpty()&&heights[i]<=heights[stack.peek()]){
int j =stack.pop();
int k = stack.isEmpty()?-1:stack.peek();
ans = Math.max(ans,heights[j]*(i-k-1));
}
stack.push(i);
}
while(!stack.isEmpty()){
int j =stack.pop();
int k = stack.isEmpty()?-1:stack.peek();
ans = Math.max(ans,heights[j]*(heights.length-k-1));
}
return ans;
}
}