题目描述
给定一个整数数组 temperatures
,表示每天的温度,返回一个数组 answer
,其中 answer[i]
是指对于第 i
天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0
来代替。
示例 1:
输入: temperatures
= [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]
示例 2:
输入: temperatures = [30,40,50,60] 输出: [1,1,1,0]
示例 3:
输入: temperatures = [30,60,90] 输出: [1,1,0]
提示:
1 <= temperatures.length <= 105
30 <= temperatures[i] <= 100
解题思路
这个问题可以通过使用栈来有效解决,栈用于跟踪还没有找到下一个更大温度的天数的索引。
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
int n = temperatures.size();
stack<pair<int, int>> stk;
vector<int> ans(n, 0);
for (int i = 0; i < n; i++) {
while (!stk.empty() && temperatures[i] > stk.top().second) {
int j = stk.top().first;
stk.pop();
ans[j] = i - j;
}
stk.push({i, temperatures[i]});
}
return ans;
}
};
步骤解析:
-
初始化:
n
表示数组temperatures
的长度。stk
(栈)用来存储一对值:每天的索引和对应的温度。栈帮助我们追踪哪些日子的气温还未找到一个更高值。ans
数组用于存储结果,初始时每个元素都设置为 0。
-
遍历温度列表:
- 对于
temperatures
中的每一天,使用变量i
来索引和遍历。 - 检查栈是否为空以及当前天的气温是否高于栈顶元素记录的气温(
stk.top().second
)。- 如果是,这意味着我们找到了对于栈顶元素(之前某一天的气温)的“下一个更高的温度”。
- 弹出栈顶元素,计算两天之间的差距,更新
ans
数组。
- 将当前天的索引和温度作为一对放入栈中,等待后续的比较。
- 对于
-
处理栈中剩余的元素:
- 由于代码逻辑,所有在栈中剩余的元素都没有找到更高的气温,因此它们在
ans
数组中保持为 0,这与初始化时设置的值相符。
- 由于代码逻辑,所有在栈中剩余的元素都没有找到更高的气温,因此它们在
代码效率
- 时间复杂度:O(n),其中 n 是
temperatures
数组的长度。每个元素最多被压入和弹出栈一次。 - 空间复杂度:O(n),主要是栈空间的使用。