代码随想录
84.柱状图中最大的矩形
思路
暴力解法:
对每一列往左右两边找到更小的那一列,结束,然后计算当前的最大面积
即为当前列的高度*左右两边更小的列的宽度(不包括左右两列)
单调栈:
与接雨水相反,用凸的那一部分记录最大的面积
使用从栈头到栈底递减的单调栈,
一旦遇到更小的就弹出凸的部分,记录此时的面积
面积=w*h
其中h=中间列
单调栈中记录的始终是数组下标。
注意:考虑到数组本身是降序or升序这两种特殊情况,需要对原始数组进行扩容,首位都加上一个0元素,来保证结果的正确性。
代码
class Solution {
public int largestRectangleArea(int[] heights) {
Stack<Integer> s = new Stack<>();
int[] nheights = new int[heights.length+2];
int sum = 0;
for(int i=1;i<=heights.length;i++){
nheights[i]=heights[i-1];
}
s.push(0);
for(int i =1;i<nheights.length;i++){
if(nheights[s.peek()]<nheights[i]){
s.push(i);
}else if(nheights[s.peek()]==nheights[i]){
s.pop();
s.push(i);
}else{
while(!s.isEmpty() && nheights[s.peek()]>nheights[i]){
int mid = s.pop();
if(!s.isEmpty()){
int h = nheights[mid];
int w = i-s.peek()-1;
sum = Math.max(sum,h*w);
}
}
s.push(i);
}
}
return sum;
}
}