代码解析:每日温度(dailyTemperatures)
📌 题目概述
给定一个数组 temperatures,其中 temperatures[i] 表示第 i 天的温度。对于每一天,找到下一次温度更高的天数(间隔天数)。如果之后没有更高的温度,则返回 0。
📌 思路
该问题可以使用**单调栈(单调递减栈)**来解决。
⚡ 主要思想
• 栈中存储的是索引(i),而不是温度值本身。
• 栈维护的是一个单调递减的序列,也就是说,栈中的索引对应的 temperatures 值是递减的。
• 遍历数组 temperatures:
• 如果当前温度 temperatures[i] 大于 栈顶索引对应的温度 temperatures[stack.top()],说明找到了栈顶索引位置的下一个更高温度。
• 计算两者的索引差 i - stack.top(),更新结果数组 ans,然后弹出栈顶元素。
• 继续检查栈中剩余的元素,直到栈为空或者栈顶元素的温度大于等于当前温度 temperatures[i]。
• 当前索引 i 入栈,继续遍历。
📌 代码
class Solution {
public:vector<int> dailyTemperatures(vector<int>& temperatures) {stack<int> res; // 维护一个存储索引的单调递减栈vector<int> ans(temperatures.size(), 0); // 结果数组,初始化为 0for (int i = 0; i < temperatures.size(); i++) {// 当栈不为空,且当前温度高于栈顶索引对应的温度while (!res.empty() && temperatures[res.top()] < temperatures[i]) {int preIndex = res.top(); // 取出栈顶索引res.pop(); // 弹出栈顶ans[preIndex] = i - preIndex; // 计算间隔天数}res.push(i); // 当前索引入栈}return ans;}
};
📌 运行示例
输入
vector<int> temperatures = {73, 74, 75, 71, 69, 72, 76, 73};
Solution sol;
vector<int> result = sol.dailyTemperatures(temperatures);
输出
[1, 1, 4, 2, 1, 1, 0, 0]
📌 详细运行步骤
输入:temperatures = [73, 74, 75, 71, 69, 72, 76, 73]
遍历 i | 当前温度 temperatures[i] | 栈状态 res | 更新 ans |
---|---|---|---|
0 | 73 | [0] | - |
1 | 74 | [1] | ans[0] = 1-0 = 1 |
2 | 75 | [2] | ans[1] = 2-1 = 1 |
3 | 71 | [2, 3] | - |
4 | 69 | [2, 3, 4] | - |
5 | 72 | [2, 3, 5] | ans[4] = 5-4 = 1, ans[3] = 5-3 = 2 |
6 | 76 | [6] | ans[5] = 6-5 = 1, ans[2] = 6-2 = 4 |
7 | 73 | [6, 7] | - |
最终 ans 数组:
[1, 1, 4, 2, 1, 1, 0, 0]
📌 时间复杂度分析
• 遍历一次 temperatures,执行 O(n) 次循环。
• 每个元素最多入栈、出栈各一次,栈的操作也是 O(n) 。
• 总时间复杂度:O(n)。
📌 关键点总结
1. 使用单调栈存储索引,确保栈内的温度是递减的。
2. 遇到更高温度时,计算间隔天数并出栈,直到栈为空或栈顶温度仍然较大。
3. 时间复杂度 O(n),每个元素最多被入栈和出栈各一次,保证高效性