例题
【739】每日温度
思路:
1、根据需求存储栈里的内容,如本题存储的是右侧第一个更高温度的位置
2、搞清楚是递增栈还是递减栈,如本题为递增栈,栈顶是最高温度的位置
代码:
/**
* @param {number[]} temperatures
* @return {number[]}
*/
var dailyTemperatures = function(temperatures) {
const n = temperatures.length;
const ans = Array(n).fill(0);
const st = [];
for(let i = n - 1; i >= 0; i--){
while(st.length && temperatures[st[st.length - 1]] <= temperatures[i]){
st.pop()
}
if(st.length){
ans[i] = st[st.length - 1] - i
}
st.push(i)
}
return ans
};
【1944】队列中可以看到的人数
思路:
1、第一个更高的人,选择递增栈
2、栈存储的内容为身高
3、求解的是 右侧矮的个数+第一个更高的
代码:
// 单调栈
var canSeePersonsCount = function(heights) {
// 计算
const n = heights.length;
// 初始化返回值
const ans = Array(n).fill(0);
// 初始化栈,js中用数组
const st = []
// 从后往前遍历所有元素
for(let i = n - 1; i >= 0; i--){
// 如果栈顶元素小于当前元素,出栈
while(st.length && st[st.length - 1] < heights[i]){
st.pop();
ans[i]++;
}
// 栈里还有元素,能看到1个
if(st.length){
ans[i]++;
}
st.push(heights[i])
}
return ans
};
【42】接雨水
思路:
1、右侧更高的,从左向右遍历,递减栈
2、要知道宽度,栈内存储位置
3、求解的是面积,面积的算法三个点: h=min(栈第二个,当前) - 栈顶,w = 当前 - 栈第二个 - 1
代码
/**
* @param {number[]} height
* @return {number}
*/
var trap = function(height) {
let ans = 0;
const st = [];
// 栈里压入位置
for (let i = 0; i < height.length; i++) {
while (st.length && height[i] >= height[st[st.length - 1]]) {
const bottomH = height[st.pop()];
if (st.length === 0) {
break;
}
const left = st[st.length - 1];
const dh = Math.min(height[left], height[i]) - bottomH; // 面积的高
ans += dh * (i - left - 1);
}
st.push(i);
}
return ans;
};