单调栈在基础应用(下一个更大元素)之上,还能解决柱状图最大矩形、接雨水、股票价格跨度等经典问题。本篇聚焦单调栈的进阶应用与思维模式。
一、单调栈回顾
Mermaid · 渲染中(下方为源码)
graph LR A[单调栈] --> B[柱状图最大矩形] A --> C[接雨水] A --> D[股票价格跨度]
维护一个单调递增(或递减)的栈,每个元素最多入栈出栈各一次 → O(n)。
// 模板:找每个元素右边第一个比它大的
int[] nextGreater(int[] nums) {
int n = nums.length;
int[] result = new int[n];
Arrays.fill(result, -1);
Deque<Integer> stack = new ArrayDeque<>(); // 存索引
for (int i = 0; i < n; i++) {
while (!stack.isEmpty() && nums[stack.peek()] < nums[i]) {
result[stack.pop()] = nums[i];
}
stack.push(i);
}
return result;
}二、柱状图最大矩形(LeetCode 84)
对每根柱子,找左右第一个比它矮的位置 → 宽度确定 → 面积。
int largestRectangleArea(int[] heights) {
int n = heights.length;
Deque<Integer> stack = new ArrayDeque<>();
int maxArea = 0;
for (int i = 0; i <= n; i++) {
int h = (i == n) ? 0 : heights[i]; // 哨兵
while (!stack.isEmpty() && heights[stack.peek()] > h) {
int height = heights[stack.pop()];
int width = stack.isEmpty() ? i : i - stack.peek() - 1;
maxArea = Math.max(maxArea, height * width);
}
stack.push(i);
}
return maxArea;
}