Problem: 84. 柱状图中最大的矩形
思路
这道题需要求出矩形最大的面积,我们需要用到两次单调栈,分别存放每一个矩形右边最小的第一个位置下标和左边最小的第一个位置下标,最后一个一个矩形的去求面积就好
解题方法
使用rights[n]和lefts[n]两个int数组去遍历存放每一个元素对应的下一个更小,由于最后一个没有下一个更小,所以默认赋值rights都是n,然后左边第一个继续往左同理没有下一个更小就lefts赋初值-1,然后两次遍历完后就可以一个一个求面积更新最大了
复杂度
- 时间复杂度:
添加时间复杂度, 示例: O ( n ) O(n) O(n)
- 空间复杂度:
添加空间复杂度, 示例: O ( n ) O(n) O(n)
Code
class Solution {
public int largestRectangleArea(int[] heights) {
int n = heights.length;
Deque<Integer> stack = new LinkedList();
int[] rights = new int[n];
Arrays.fill(rights,n);
for(int i = 0;i<n;i++){
while(!stack.isEmpty() && heights[stack.getLast()]>heights[i]){
int top = stack.pollLast();
rights[top] = i;
}
stack.addLast(i);
}
int[] lefts = new int[n];
Arrays.fill(lefts,-1);
stack = new LinkedList();
for(int i = n-1;i>=0;i--){
while(!stack.isEmpty() && heights[stack.getLast()]>heights[i]){
int top = stack.pollLast();
lefts[top] = i;
}
stack.addLast(i);
}
int res = 0;
for(int i = 0;i<n;i++){
res = Math.max(res,(rights[i]-lefts[i]-1)*heights[i]);
}
return res;
}
}