单调栈
单调栈
单调为单调递增 / 单调递减,通过栈的方式找到单调增的顺序 / 单调减的顺序。
规则:
新元素入栈时,弹出破坏栈内单调性的栈顶元素。
出栈时触发计算(计算目标值)
Example:
- 接雨水
- 柱状图中的最大矩形
- 最高温度
- 下一个更大元素 I
模版:
// 单调栈模板:计算 nums 中每个元素的下一个更小或相等的元素
int[] nextLessOrEqualElement(int[] nums) {
int n = nums.length;
// 存放答案的数组
int[] res = new int[n];
Stack<Integer> s = new Stack<>();
// 倒着往栈里放
for (int i = n - 1; i >= 0; i--) {
// 删掉 nums[i] 后面较大的元素
while (!s.isEmpty() && s.peek() > nums[i]) {
s.pop();
}
// 现在栈顶就是 nums[i] 身后的更小或相等元素
res[i] = s.isEmpty() ? -1 : s.peek();
s.push(nums[i]);
}
return res;
}

浙公网安备 33010602011771号