根据每日气温列表,请重新生成一个列表,对应位置的输出是需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用0来代替。
例如,给定一个列表temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是[1, 1, 4, 2, 1, 1, 0, 0]。
提示:气温 列表长度的范围是[1, 30000]。每个气温的值的均为华氏度,都是在[30, 100]范围内的整数。
假设输出数组为res[];
思路1-递减栈

- 维护一个递减栈
stack,里面存放对应的索引,索引0先入栈 top为栈顶索引,从1开始遍历原始数组temperatures[i]- 碰到比
temperatures[stack[top]]小的值,索引i入栈。 - 如果比
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]=0即i后面没有更大的数。
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;
}