题目:
https://leetcode-cn.com/problems/largest-rectangle-in-histogram/
import java.util.Arrays; import java.util.Stack; public class _84_LargestRectangleArea { // 单调栈(双侧) public int largestRectangleArea(int[] heights) { int len = heights.length; Stack<Integer> stack = new Stack<>(); int[] result = new int[heights.length]; for (int i = 0; i < len; i++) { while (!stack.empty() && heights[i] < heights[stack.peek()]) { int top = stack.pop(); result[top] += (i - top) * heights[top]; } stack.push(i); } while (!stack.empty()) { int top = stack.pop(); result[top] += (heights.length - top) * heights[top]; } for (int i = len - 1; i >= 0; i--) { while (!stack.empty() && heights[i] < heights[stack.peek()]) { int top = stack.pop(); result[top] += (top - i - 1) * heights[top]; } stack.push(i); } while (!stack.empty()) { int top = stack.pop(); result[top] += top * heights[top]; } return Arrays.stream(result).max().getAsInt(); } // 单调栈-确认左右两边小于当前高度第一个位置 public int largestRectangleArea1(int[] heights) { int len = heights.length; int[] left = new int[len]; int[] right = new int[len]; Stack<Integer> stack = new Stack<>(); for (int i = 0; i < len; i++) { while (!stack.isEmpty() && heights[i] < heights[stack.peek()]) { int top = stack.pop(); right[top] = i; } left[i] = stack.isEmpty() ? -1 : stack.peek(); stack.push(i); } while (!stack.isEmpty()) { int top = stack.pop(); right[top] = len; } int max = 0; for (int i = 0; i < len; i++) { max = Math.max(max, (right[i] - left[i] - 1) * heights[i]); } return max; } public static void main(String[] args) { // TODO Auto-generated method stub int[] a = {2, 1, 5, 6, 2, 3}; new _84_LargestRectangleArea().largestRectangleArea(a); } }