单调栈

LC 84. 柱状图中最大的矩形

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。

upload successful

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
class Solution {
public int largestRectangleArea(int[] heights) {
List<Integer>left = new ArrayList(); // index
List<Integer>right = new ArrayList(); // index
for(int i=0; i<heights.length;i++) {
left.add(-1);
right.add(heights.length);
}
Stack<Integer>minStack = new Stack(); // <index>
// left side nearest index lower then i
for (int i = 0; i < heights.length; i++) {
if(minStack.size() <= 0) {
minStack.push(i);
continue;
}
while(!minStack.isEmpty() && heights[minStack.peek()]>=heights[i]){
minStack.pop();
}
if (!minStack.isEmpty()) {
left.set(i,minStack.peek());
}
minStack.push(i);
}
minStack = new Stack(); // <index>
for (int i = heights.length-1; i>=0; i--) {
if(minStack.size() <= 0) {
minStack.push(i);
continue;
}
while(!minStack.isEmpty() && heights[minStack.peek()]>=heights[i]){
minStack.pop();
}
if (!minStack.isEmpty()) {
right.set(i,minStack.peek());
}
minStack.push(i);
}
int maxArea = 0;
for (int i = 0; i < heights.length; i++) {
int newArea = (heights[i]*(right.get(i)-left.get(i)-1));
maxArea = newArea > maxArea ? newArea:maxArea;
}
return maxArea;
}
}
文章目录
  1. 1. LC 84. 柱状图中最大的矩形
| 本站总访问量次 ,本文总阅读量