题目链接:https://leetcode.cn/problems/daily-temperatures/
第一个想法是简单两个 for 循环,但是可能会超时(其实用C++不会超时)。
因为最近在做栈的题目,所以想到了最小栈(原来叫作最小栈啊~),时间复杂度为 O ( N ) O(N) O(N)。我的解法有点傻,还特意建了一个结构体,其实完全没必要,栈内只需要存储下标就好了,对应的温度可以直接通过数组索引。
struct Tem {
int temp;
int index;
Tem (int t, int i) {
temp = t;
index = i;
}
};
vector<int> dailyTemperatures(vector<int>& temperatures) {
int len = temperatures.size();
vector<int> answer(len, 0);
stack<Tem> stk;
for (int i = 0; i < len; i++) {
int t = temperatures[i];
while (true) {
if (stk.empty()) {
stk.push(Tem(t,i));
break;
}
else if (t <= stk.top().temp) {
stk.push(Tem(t,i));
break;
}
else {
int index = stk.top().index;
answer[index] = i - index;
stk.pop();
}
}
}
return answer;
}
看了官方的暴力解 https://leetcode.cn/problems/daily-temperatures/solutions/283196/mei-ri-wen-du-by-leetcode-solution/,属实有点难以想到:
- 从 [30,100] 的温度入手,维护一个以温度为索引,以最早出现对应温度的时间为值的数组记为 T T T。
- 倒着遍历原数组,遇到温度 t 时,从 T T T 中遍历 [t+1, 100] 寻找最早天数,计算差值得到等待时间,更新 T T T中对应的值。
时间复杂度是 O ( N M ) O(NM) O(NM), N N N是数组长度, M M M是温度区间。