算法-每日一题(DAY11)每日温度

1.题目链接:

739. 每日温度 - 力扣(LeetCode)

2.题目描述:

给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。

示例 1:

cpp 复制代码
输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]
示例 2:

示例 2:

cpp 复制代码
输入: temperatures = [30,40,50,60]
输出: [1,1,1,0]

示例 3:

cpp 复制代码
输入: temperatures = [30,60,90]
输出: [1,1,0]

提示:

cpp 复制代码
1 <= temperatures.length <= 105
30 <= temperatures[i] <= 100

3.解题思路:

这段代码采用了栈的思路,通过栈来解决"每日温度升高问题"。首先,定义一个栈 stk 来存储温度的索引,用于追踪尚未找到升高温度的天数。将第一个温度的索引 0 入栈,确保能在后续遍历时找到初始索引。接着,定义一个 res 数组,用来记录每一天到下一次温度升高的天数,初始化为 0。接下来,从第二天开始遍历 temperatures 数组,对于每一天的温度,如果当前温度大于栈顶所指向的温度,就说明当前天的温度升高了,计算从栈顶所指向的那一天到当前天的天数,并更新 res 数组,同时将栈顶元素弹出。然后继续检查下一个栈顶元素,直到栈为空或者当前温度不再高于栈顶的温度。最后,将当前天的索引压入栈中,以便后续比较。通过这种方式,栈中的每个元素都会在找到一个升高的温度后被处理,最终返回 res 数组,得到每一天到下一次温度升高的天数。

4.题解代码:

cpp 复制代码
class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) 
    {
       stack<int>stk;
        //定义一个栈 stk,用来存储索引。这个栈的作用是帮助我们追踪每天的温度的下标
       stk.push(0);
        //将第一个温度的索引 0 入栈。这里的设计其实是为了确保我们能在后面开始的循环中找到初始的索引
       vector<int>res(temperatures.size(),0);
        //定义一个大小与输入 temperatures 相同的 vector<int> 数组 res,并且初始化为 0。这个数组用来存储答案,其中 res[i] 代表从第 i 天开始,经过多少天温度会升高。如果没有升高,值就是 0。
       for(int i=1;i<temperatures.size();i++)
        //从第二天开始遍历 temperatures 数组,i 是当前遍历的天数,循环会遍历到最后一天
       {
        while(!stk.empty()&&temperatures[i]>temperatures[stk.top()])
        //检查栈中的索引所指向的温度是否小于当前温度
        //如果栈不为空,且当前的温度大于栈顶的温度,那么说明当前天的温度比栈顶的温度高,我们可以计算出这个温度升高的天数。
        {
            res[stk.top()]=i-stk.top();
            //计算从栈顶所指的那一天到当前天 i 的温度升高的天数,并更新 res 数组
            stk.pop();
            //一旦计算出从栈顶的某一天到当前天的温度升高的天数,就弹出栈顶的元素,继续检查下一个栈顶元素
        }
        stk.push(i);
        //将当前天 i 的索引压入栈中,以便在后续的循环中比较当前天的温度与栈中的其他天的温度
       }
       return res;
    }
};

5.示例演算:

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

当前索引(i) 当前温度 栈内容(索引) 操作 更新后的res
1 74 [0] 74>73 → res[0]=1-0=1 弹出0 → 栈空 [1,0,0,0,0,0,0,0]
1 74 压入1 [1,0,0,0,0,0,0,0]
2 75 [1] 75>74 → res[1]=2-1=1 弹出1 → 栈空 [1,1,0,0,0,0,0,0]
2 75 压入2 [1,1,0,0,0,0,0,0]
3 71 [2] 71<75 → 无操作 压入3 [1,1,0,0,0,0,0,0]
4 69 [2,3] 69<71 → 无操作 压入4 [1,1,0,0,0,0,0,0]
5 72 [2,3,4] 72>69 → res[4]=5-4=1 弹出4 → 栈[2,3] [1,1,0,2,1,0,0,0]
5 72 [2] 72<75 → 压入5 [1,1,0,2,1,0,0,0]
6 76 [2,5] 76>72 → res[5]=6-5=1 弹出5 → 栈[2] [1,1,4,2,1,1,0,0]
6 76 压入6 [1,1,4,2,1,1,0,0]
7 73 [6] 73<76 → 压入7 [1,1,4,2,1,1,0,0]

6.复杂度计算:

时间复杂度:每个元素最多被推入和弹出栈一次,故时间复杂度是O(n)

空间复杂度:使用了一个栈和一个与输入数组大小相同的结果数组,故空间复杂度为O(n)

**7.拓展:**如何修改算法以返回距离最近更高温度的天数

反向遍历温度数组,并记录每个温度最后出现的位置,通过比较温度差值寻找最接近的更高温度。

cpp 复制代码
#include <vector>
#include <climits>
using namespace std;

vector<int> dailyTemperatures(vector<int>& temperatures) {
    int n = temperatures.size();
    vector<int> res(n, 0);  // 初始化结果数组
    vector<int> minIndex(101, INT_MAX);  // 温度范围[30,100]的索引表

    // 反向遍历温度数组
    for (int i = n - 1; i >= 0; i--) {
        int t = temperatures[i];
        int candidateIndex = INT_MAX;  // 候选位置
        
        // 查找最接近的更高温度 (t+1 → 100)
        for (int temp = t + 1; temp <= 100; temp++) {
            if (minIndex[temp] != INT_MAX) {
                // 优先选择温度差最小且下标最小的位置
                if (candidateIndex == INT_MAX || 
                    (minIndex[temp] - i) < (candidateIndex - i)) {
                    candidateIndex = minIndex[temp];
                }
                break;  // t+1是可能的最小差值,后续温度差值更大
            }
        }
        
        // 更新结果
        if (candidateIndex != INT_MAX) {
            res[i] = candidateIndex - i;
        }
        
        // 更新当前温度的索引
        minIndex[t] = i;
    }
    return res;
}
相关推荐
Want5952 分钟前
Python漂浮的爱心
开发语言·python
你怎么知道我是队长7 分钟前
GO语言---数组
开发语言·算法·golang
算AI37 分钟前
当无人机遇上Agentic AI:新的应用场景及挑战
人工智能·算法
吴Wu涛涛涛涛涛Tao37 分钟前
深入剖析 RxSwift 中的 PriorityQueue:二叉堆的 Swift 实战
算法·ios
Dream耀41 分钟前
手写 JavaScript 的 new 操作符:从空对象到完整实例的诞生过程
前端·面试·代码规范
哆啦美玲44 分钟前
深入理解JavaScript的事件循环机制:宏任务与微任务
前端·javascript·面试
知其然亦知其所以然1 小时前
90% 的人 MyBatis 模糊查询都写错了!你中招了吗?
java·后端·面试
范纹杉想快点毕业1 小时前
Qt、C++自定义按钮、组件、事件编程开发练习,万字实战解析!!
java·c语言·开发语言·c++·git·qt·github
一语长情1 小时前
谈谈我对建立企业内部监控系统的理解
后端·面试·架构
满分观察网友z1 小时前
解密时刻:一个简单的树算法如何拯救了我混乱的配置系统(404. 左叶子之和)
后端·算法