终是圣明天子事
景阳宫井又何人
C++,算是动态规划23333,也是看了评论区大神的思路。
其实很容易想到一个O(N\^2)的方法,就是从后往前遍历,对于每个T[i]
,再往后找到第一个大于T[i]
的数,设其为T[j]
,显然找T[j]
的过程复杂度也是O(N),所以总的复杂度就是O(N\^2)了。
热评解法就是利用了一个很重要的信息,来优化找T[j]
的过程。
原来我们找找T[j]
,是一个一个往后遍历,即步长固定为1,但实际上是不需要的。我们用数组ans来返回答案,ans[j]
记录的就是从i到第一个比T[j]
大的数的距离,也就是步长为ans[j]
。从i + 1
开始:
- 若
T[i] < T[i+1]
,那么ans[i]=1
; - 若
T[i] >= T[i+1]
,则往后找第一个大于T[i]
的元素,步长就是ans[i]
- 找到第一个大于
T[i]
的元素 - 找到某个
ans[j] == 0
的元素,因为等于0说明以后再也不会有元素大于T[i]
了。
- 找到第一个大于
重点就是对于这个步长的理解,步长从原来的1换成了ans[j]
。
class Solution {
public:
vector<int> dailyTemperatures(vector<int> &T) {
int len = T.size();
vector<int> ans(len, 0);
for (int i = len - 2; i >= 0; i--) {
for (int j = i + 1; j < len; j += ans[j]) {
if (T[i] < T[j]) {
ans[i] = j - i;
break;
} else if (ans[j] == 0) {
ans[i] = 0;
break;
}
}
}
return ans;
}
};