模板
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;
};