JS算法-每日温度

188 阅读1分钟

本题来自leetcode 第 739 题

本题题目

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

例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]

提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。

解题思路

本题可以通过循环嵌套暴力解决,也可以通过单调栈更好的解决。

代码展示

方法一:暴力解法

var dailyTemperatures = function(T) {
  const len = T.length;
  const res = [];
  let r = null, j = 0;
  for(let i = 0; i < len; i++, j = i + 1) {
    if (i === len - 1) {
      res.push(0);
      break;
    }
    while(T[j] <= T[i] && j < len) {
      if (j === len - 1) {
        res.push(0);
      }
      j++;
    }
    if (T[j] > T[i]) {
      res.push(j - i);
    }
  }
  return res;
};

截屏2021-04-27下午5.58.55.png

var dailyTemperatures = function(T) {
  const len = T.length;
  const res = [];
  const stack = [];
  let l = 0, r = 0;
  for(let i = 0; i < len; i++) {
    let current = T[i];
    for(let j = i + 1; j < len; j++) {
      if(current < T[j]) {
        res[i] = j - i;
        break;
      }
      if(j === len - 1) {
        res.push(0);
      }
    }
    if (i === len - 1) {
      res.push(0);
    }
  }
  return res;
};

截屏2021-04-27下午7.28.35.png

上边通过循环嵌套的方式,时间复杂度O(mn),空间复杂度O(m),所以需要改进一下。

方法二:单调栈

var dailyTemperatures = function(T) {
  const len = T.length;
  const stack = [];
  const res = new Array(len).fill(0);
  for(let i = 0; i < len; i++) {
    while(stack.length && T[i] > T[stack[stack.length - 1]]) {
      const index = stack.pop();
      res[index] = i - index;
    }
    // 因为数组的每一项是索引的差,所以可以将索引存下来
    stack.push(i);
  }
  return res;
}

此方法时间复杂度为O(n),空间复杂度为O(n)

截屏2021-04-27下午7.41.47.png

总结

通过管理栈,只需要一次循环就可以计算出最终结果,所以方法二是比较好的。