LeetCode-剑指 Offer II 038. 每日温度

67 阅读1分钟

题目

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

示例 1:

输入: temperatures = [73,74,75,71,69,72,76,73]

输出: [1,1,4,2,1,1,0,0]

思路

  1. 用数组模拟单调栈stack,起始为空
  2. 创建一个和温度temperatures一样长度的数组,都填充为0,是为了如果这天的温度之后几天没有更高的温度,就为0,节省计算
  3. 遍历temperatures,如果stack为空,push进去第一个温度的索引,之后栈不为空,当temperatures[i]的温度值大于栈顶索引对应的温度值,栈中这个索引出栈,并且创建一个变量获取到,这个i入栈,以此类推
  4. arr数组存储索引差,为观测到更高的气温,至少需要等待的天数

代码

/**
 * @param {number[]} temperatures
 * @return {number[]}
 */
var dailyTemperatures = function(temperatures) {
  // 单调栈存的是索引
  var stack = []
  var arr = new Array(temperatures.length).fill(0)
  for(let i = 0; i < temperatures.length; i++){
    while(stack.length && temperatures[stack[stack.length - 1]] < temperatures[i]){
      // 拿到出栈的索引
      const index = stack.pop()
      // arr存储索引差,为这一天与后面高温度的间隔日期
      arr[index] = i - index
    }
    stack.push(i)
  }
  return arr
};

总结

主要还是理解了题目要干什么,然后思考用什么数据结构来实现

image.png