与官方答案不同,对暴力算法进行优化,使用动态规划算法可以得出比用栈算法更为优质的结果。算法参考了官方答案。
分析:
题目要求:vector中某一元素到该元素后比它大的元素的距离。(有些绕就是顺序查找比他大并且离它最近的元素)很自然的想到用动态规划。
思路:在暴力解法中如果想要从后向前遍历到一位置,再从目标位置向后找比它大的元素,是会一个一个比较的直至找到比他大的,动态规划就是使用备忘录,记录以往遍历过的元素离它最近的大于它的元素的距离。这个备忘录就是题目的解。
- 设置一个备忘录也就是最终的结果,预置大小初始化为0
- i从倒数第二个位置开始向上递增,j每次循环初始化为i+1
- 第一次循环对应的是倒数第二个与倒数第一个的比较,此处利用初始化为0隐含了倒数第一个天的气温不会再有比他大的了,所以直接从倒数第二个开始比较。(区别于其他的动态规划题目需要的备忘录大小size+1)
- 当遇到T[i]<T[j]时 res[j]==0这种情况只是针对这个数组的最大值和从后往前数的极大值两种状况会跳出循环。其余情况下就利用备忘录跳跃的前进。
- 最终输出备忘录即结果
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& T) {
vector<int> res(T.size(), 0);
for (int i = res.size() - 2; i > -1; --i){
int j = i + 1;
while(j < res.size())
{
if (T[j] > T[i])
{
res[i] = j - i;
break;
}
else
{
if (res[j] == 0)
{
break;
}
else
{
j += res[j];
}
}
}
}
return res;
}
};