Day60 单调栈 part03
最后一天啦!完结撒花~
84.柱状图中最大的矩形
我的思路:
感觉和接雨水差不多,只需要多考虑一些情况
双指针
lheight 和 rheight 分别是用来存储每个柱子的左边界和右边界的数组。
解答:
class Solution {public int largestRectangleArea(int[] heights) {int res = 0;int[] lheigth = new int[heights.length];int[] rheight = new int[heights.length];for(int i = 0; i < heights.length; i++) {int j = i - 1;while(j >= 0 && heights[j] >= heights[i]) {j = lheigth[j];}lheigth[i] = j;}for(int i = heights.length - 1; i >= 0; i--) {int j = i + 1;while(j < heights.length && heights[j] >= heights[i]) {j = rheight[j];}rheight[i] = j;}for(int i = 0; i < heights.length; i++) {int h = heights[i];int w = rheight[i] - lheigth[i] - 1;res = Math.max(res, h * w);}return res;}
}
单调栈
解答:
class Solution {public int largestRectangleArea(int[] heights) {Stack<Integer> stack = new Stack<>();int res = 0;int n = heights.length;for(int i = 0; i <= n; i++) {int currheight = (i == n) ? 0 : heights[i];while(!stack.isEmpty() && currheight < heights[stack.peek()]) {int h = heights[stack.pop()];int distance = stack.isEmpty() ? i : i - stack.peek() - 1;res = Math.max(res, distance * h);}stack.push(i);}return res;}
}
革命尚未成功,同志仍需努力!