js单调栈解题模板
模板
function solve(arr) {const stack = [];const result = new Array(arr.length).fill(默认值);for (let i = 0; i < arr.length; i++) {while (stack.length && 比较条件(arr[i], arr[栈顶])) {const top = stack.pop();result[top] = 计算结果(i, top); }stack.push(i);}return result;
}
例题一:每日温度
题目描述
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。
示例 1:
输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]
代码
//"需要为每个元素寻找下一个更大/更小元素"这类问题适用于单调栈
var dailyTemperatures = function(temperatures) {const n = temperatures.length;let stack = [];let ans = new Array(n).fill(0);for(let i=0; i<n; i++){while(stack.length && temperatures[i] > temperatures[stack[stack.length-1]]){let cur = stack.pop();ans[cur] = i-cur;}stack.push(i);}return ans;
};
例题二:柱状图中最大的矩形
题目描述
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
代码
var largestRectangleArea = function(heights) {// 头部加0:避免空栈判断,保证栈永远不为空// 尾部加0:强制所有有效柱子出栈计算heights = [0,...heights,0];const n = heights.length;let st = [];let ans = 0;for(let i=0; i<n; i++){while(st.length && heights[i] < heights[st[st.length-1]]){let h = heights[st.pop()];let w = i-st[st.length-1]-1; //左边界减去右边界(栈顶元素是第一个比当前矮的左柱子)ans = Math.max(ans, h*w); }st.push(i);}return ans;
};