leetcode 84. 柱状图中最大的矩形-java实现
题目所属分类
单调栈解决的问题就是左边离它最近的且比它小的数的下标
枚举加优化
复习单调栈的模板
原题链接
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
代码案例:
题解

单调栈的写法
class Solution {
public int largestRectangleArea(int[] heights) {
int n = heights.length;
int[] left = new int[n+1];
int[] right = new int[n+1];
Stack<Integer> s = new Stack<>();
//形成左边界
for(int i = 0 ; i < heights.length ; i++){
while(!s.isEmpty() && heights[s.peek()] >= heights[i]) s.pop();
if(s.isEmpty()) left[i] = -1 ;
else left[i] = s.peek();
s.push(i);
}
s.clear();
//形成右边界
for(int i = n-1 ; i >= 0 ; i--){
while(!s.isEmpty() && heights[s.peek()] >= heights[i]) s.pop();
if(s.isEmpty()) right[i] = n ;
else right[i] = s.peek();
s.push(i);
}
//遍历高
int res = 0 ;
for(int i = 0 ; i < n ; i++){
res = Math.max(res,heights[i]*(right[i]-left[i]-1));//存的是范例中1的右边和2的左边
}
return res;
}
}
数组的写法
class Solution {
public int largestRectangleArea(int[] h) {
int n=h.length;
int[] stk=new int[n+5];
int[] left=new int[n];
int[] right=new int[n];
int tt=0;
for(int i=0;i<n;i++)
{
while(tt>0&&h[stk[tt]]>=h[i]) tt--;
if(tt>0) left[i]=stk[tt];
else left[i]=-1;
stk[++tt]=i;
}
stk=new int[n+5];
tt=0;
for(int i=n-1;i>=0;i--)
{
while(tt>0&&h[stk[tt]]>=h[i]) tt--;
if(tt>0) right[i]=stk[tt];
else right[i]=n;
stk[++tt]=i;
}
int ans=0;
for(int i=0;i<n;i++)
{
ans=Math.max(ans,h[i]*(right[i]-left[i]-1));
}
return ans;
}
}


浙公网安备 33010602011771号