LC 84. 柱状图中最大的矩形
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。

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; } }
|