leetcode 739. 每日温度

本文介绍了一种使用单调栈解决特定问题的方法——给定每日温度,计算等待更暖和天气所需的天数。通过维护一个单调递减栈并遍历温度数组,实现了高效计算。最终返回一个数组,表示每天到下一个更暖和日子的天数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、题目

给定每天的温度,求对于每一天需要等几天才可以等到更暖和的一天。如果该天之后不存在更暖和的天气,则记为 0
输入

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

输出

[1, 1, 4, 2, 1, 1, 0, 0]

二、解法

2.1 单调栈

解题思路:本题为单调栈经典题型,我们可以维持一个单调递减的栈,表示每天的温度;为了方便计算天数差,我们这里存放位置(即日期)而非温度本身。我们从左向右遍历温度数组,对于每个日期 p,如果 p 的温度比栈顶存储位置 q 的温度高,则我们取出 q,并记录 q 需要等待的天数为 p − q;我们重复这一过程,直到 p 的温度小于等于栈顶存储位置的温度(或空栈)时,我们将 p 插入栈顶,然后考虑下一天。在这个过程中,栈内数组永远保持单调递减,避免了使用排序进行比较。最后若栈内剩余一些日期,则说明它们之后都没有出现更暖和的日期。

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& T) {
      int n = T.size();
      vector<int> ans(n);
      stack<int> indices;  // 存储日期
      for (int i = 0; i < n; ++i) {
        while (!indices.empty()) {
          if (T[i] <= T[indices.top()]) {  // 如果i的温度比栈顶元素的温度高则进行记录
            break;
          }
          ans[indices.top()] = i - indices.top(); // 记录等待天数
          indices.pop();  // 若推入的日期的温度大于栈顶元素,则将栈顶日期弹出
        }
        indices.push(i);  // 若栈不为空,且推入温度的日期小于等于栈顶温度的日期推入
      }
      return ans;
    }
};

复杂度分析

  • 时间复杂度:O(n),其中n是温度列表的长度。正向遍历温度列表一遍,对于温度列表中的每个下标,最多有一次进栈和出栈的操作。
  • 空间复杂度:O(n),其中n是温度列表的长度。需要维护一个单调栈存储温度列表中的下标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值