一、题目
给定每天的温度,求对于每一天需要等几天才可以等到更暖和的一天。如果该天之后不存在更暖和的天气,则记为 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是温度列表的长度。需要维护一个单调栈存储温度列表中的下标。