739. Daily Temperatures

你快乐吗

Posted by bbkgl on January 31, 2020

终是圣明天子事

景阳宫井又何人

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;
    }
};