Leetcode-739每日温度

329 阅读2分钟

根据每日气温列表,请重新生成一个列表,对应位置的输出是需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用0来代替。

例如,给定一个列表temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是[1, 1, 4, 2, 1, 1, 0, 0]

提示:气温 列表长度的范围是[1, 30000]。每个气温的值的均为华氏度,都是在[30, 100]范围内的整数。

假设输出数组为res[];

思路1-递减栈

  1. 维护一个递减栈stack,里面存放对应的索引,索引0先入栈
  2. top为栈顶索引,从1开始遍历原始数组temperatures[i]
  3. 碰到比temperatures[stack[top]]小的值,索引i入栈。
  4. 如果比temperatures[stack[top]]大,则出栈,直到栈为空或temperatures[stack[top]]>temperatures[i],索引i入栈,出栈过程中res[stack[top]] = i - stack[top]
int* dailyTemperatures(int* T, int TSize, int* returnSize){
    *returnSize = TSize;
    int *result = (int*)calloc(TSize, sizeof(int));
    int *stack = (int*)calloc(TSize, sizeof(int));
    int top = 0;
    stack[0] = 0;
    for(int i = 1; i < TSize; i++) {
        while(top >= 0 && T[stack[top]] < T[i]) {
            result[stack[top]] = i - stack[top];
            top--;
        }
        stack[++top] = i;
    }
    return result;
}

思路2-动态规划

假设temperatures长度为n ,通过观察可以得到一下几点:

  • res[n-1]必定为0
  • 如果temperatures[n-2]>temperatures[n-1],res[n-2]0,否则res[n-2]1
  • 对于任意i(0 <= i < n-1)来说,如果temperatures[i]<temperatures[i+1],res[i]=1,否则将temperatures[i]temperatures[i+1+res[i+1]]比较,依次类推直到找到>temperatures[i]的数或者res[i]=0i后面没有更大的数。
int* dailyTemperatures_1(int* T, int TSize, int* returnSize){
    *returnSize = TSize;
    int *result = (int*)calloc(TSize, sizeof(int));
    result[TSize-1] = 0;
    for(int i = TSize-2; i >=0; i--) {
        if(T[i] < T[i+1]) {
            result[i] = 1;
        }else {
            int j = i + 1 + result[i+1];
            while(T[i] >= T[j] && result[j] != 0) {
                j += result[j];
            }
            result[i] = T[j] > T[i] ? j - i : 0;
        }
    }
    return result;
}