739. Daily Temperatures

25 年 8 月 27 日 星期三
363 字
2 分钟

739. Daily Temperatures

Screenshot 2025-08-27 at 12.30.51 pm
Screenshot 2025-08-27 at 12.38.45 pm

本题要求的是在 i 右边最近的 >=temp[i] 的数,这是单调栈的标准应用

https://leetcode.cn/problems/daily-temperatures/solutions/2470179/shi-pin-jiang-qing-chu-wei-shi-yao-yao-y-k0ks

单调栈

从右向左

js
/**
 * @param {number[]} temperatures
 * @return {number[]}
 */

// 从右向左看
var dailyTemperatures = function (temperatures) {
  const stack = []
  const n = temperatures.length
  const ans = Array(n).fill(0)
  for (let i = n - 1; i >= 0; i--) {
    const x = temperatures[i]
    while (stack.length > 0 && temperatures[stack[stack.length - 1]] <= x) {
      // 当stack不为空,并且栈顶元素小于当前元素时,出栈小于当前元素的栈元素
      stack.pop()
    }
    if (stack.length > 0) {
      ans[i] = stack[stack.length - 1] - i
    }
    stack.push(i)
  }
  return ans
}

从左向右

从左向右看,将未有答案的数组放到单调栈里,为什么用单调栈?这里我们将单调栈视为一个todolist,如果一个元素(比如5)大于栈顶的最小元素(3,i = 5时, monoStack = [4, 3]),那么3的答案就可以确定了,并且这个单调栈中所有比5小的元素的答案都可以确定了。只有比5大的元素,以及5不能确定。放在todolist里。

js
/**
 * @param {number[]} temperatures
 * @return {number[]}
 */
var dailyTemperatures = function (temperatures) {
  const stack = [] // 单调栈 保存下标
  const n = temperatures.length
  const ans = new Array(n).fill(0)
  for (let i = 0; i < n; i++) {
    const t = temperatures[i]
    while (stack.length && t > temperatures[stack[stack.length - 1]]) {
      // stack.length 跳过第一次, js中空数组是true
      const j = stack.pop()
      ans[j] = i - j
    }
    stack.push(i)
  }
  return ans
}

文章标题:739. Daily Temperatures

文章作者:Sirui Chen

文章链接:https://blog.siruichen.me/posts/739_daily_temperatures[复制]

最后修改时间:


商业转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,您可以自由地在任何媒体以任何形式复制和分发作品,也可以修改和创作,但是分发衍生作品时必须采用相同的许可协议。
本文采用CC BY-NC-SA 4.0进行许可。