单调栈是一个特殊的栈结构,它可以帮助我们快速地找到数组中的某个元素左侧或右侧比其大或小的第一个元素。根据具体需求,单调栈可以是单调递增或单调递减。
单调栈
function monotonicStack(nums) {
let stack = [];
let result = new Array(nums.length).fill(-1); // 初始化结果数组
for (let i = 0; i < nums.length; i++) {
while (stack.length && nums[i] > nums[stack[stack.length - 1]]) {
let last = stack.pop();
result[last] = nums[i];
}
stack.push(i);
}
return result;
}
在此模板中,我们遍历给定的nums数组,然后利用一个单调栈来确定每个元素右侧第一个比其大的元素。如果你想找左侧第一个比它大的元素或其他类似的变体,你可以适当地修改这个模板。
常见题型
- 下一个更大元素:给你两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。
- 每日温度:给你一个数组 temperatures ,其中 temperatures[i] 表示第 i 天的气温,请你返回一个数组,对应位置的输出是需要再等待多久温度才会升高超过该日的温度。如果之后都不会升高,请在该位置用 0 来代替。
- 直方图中的最大矩形:给定一个仅包含正整数的直方图,直方图的宽度为 1,找到直方图中面积最大的矩形。
单调栈通常用于解决涉及数组中连续区间或子数组问题的问题,特别是当我们需要快速找到元素左侧或右侧满足某些条件的元素时。