剑指 Offer II 038. 每日温度(栈模块:单调栈)

166 阅读1分钟

每日刷题第14天 2021.1.9

每日温度

  • 难度:中等
  • 方法:单调栈

题目

  • 请根据每日 气温 列表 temperatures ,重新生成一个列表,要求其对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。

示例

输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]
输入: temperatures = [30,40,50,60]
输出: [1,1,1,0]
输入: temperatures = [30,60,90]
输出: [1,1,0]

提示

  • 1 <= temperatures.length <= 105
  • 30 <= temperatures[i] <= 100

解法

  • 暴力模拟:双循环
/**
* @param {number[]} temperatures
* @return {number[]}
*/
var dailyTemperatures = function(temperatures) {
// 暴力模拟下
let lenT = temperatures.length;
let ans = new Array(lenT).fill(0);
//  console.log(ans,'ans');
// 记录长度
let len = 0;
for (let i = 0; i < temperatures.length; i++) {
 len = 0;
 for (let j = i + 1; j < temperatures.length; j++) {
   if (temperatures[j] > temperatures[i]) {
     // 如果大于,记录结果存储
     len = j - i;
     ans[i] = len;
     break;
    }
  }
}
 return ans;
};
  • 单调栈方法
  1. 判断栈是否为空,为空则压入当前数值的下标(索引值)
  2. 栈不为空,比较当前值与栈顶元素的大小。
    • 大于则弹出栈顶元素并记录当前的间距(while循环)
    • 小于,直接压入栈中即可。
// 方法:单调栈
let stack = [];
// 结果存储数组
let lenT = temperatures.length;
let ans = new Array(lenT).fill(0);
for (let i = 0; i < temperatures.length; i++) {
  // 如果栈空,就压入数值
  if (stack.length == 0) {
    // 记录下标就可以
    stack.push(i);
  }else {
    // 栈非空,比较大小
    // 大:弹出,计算长度
    while (temperatures[i] > temperatures[stack[stack.length - 1]]) {
      // 记录长度
      ans[stack[stack.length - 1]] = i - stack[stack.length - 1];
      // 一直弹出
      stack.pop();
    }
    // 小:直接压入
    stack.push(i);
  }
}
return ans;
};

附录

  • 单调栈的理解与使用,栈顶元素、栈底元素。