题目
- 根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高的天数。如果之后都不会升高,请输入 0 来代替。
示例
①示例1
- 例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。
说明
提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的都是 [30, 100] 范围内的整数。
①相关话题
- 栈
②相似题目
③题目地址
解题方法
①暴力解法改进
- 时间复杂度:O(N^2)。
- 空间复杂度:O(1)。
②栈
- 维护一个递减栈,若当前元素大于栈顶元素,则说明温度升高,栈顶元素出栈,两者下标的差值即为栈顶元素所在下标的所求天数。
- 直到当前元素小于栈顶元素,当前元素入栈,继续判断。
- 时间复杂度:O(N)。
- 空间复杂度:O(N)。
代码详解
- 暴力解法改进
int* dailyTemperatures(int* T, int TSize, int* returnSize) {
int* result = (int*)malloc(sizeof(int)*TSize);
*returnSize = TSize;
result[TSize-1] = 0;
for (int i = 0; i < TSize-1; i++) {
// 改进:前后两天温度相等时,不用再重复判断。
if (i > 0 && T[i] == T[i-1])
result[i] = result[i-1] == 0? 0: result[i-1]-1;
else {
for (int j = i+1; j < TSize; j++) {
if (T[j] > T[i]) {
result[i] = j-i;
break;
}
// 温度不会再升高。
if (j == TSize-1)
result[i] = 0;
}
}
}
return result;
}
- 栈
int* dailyTemperatures(int* T, int TSize, int* returnSize) {
int* result = (int*)malloc(sizeof(int)*TSize);
// 用栈记录T的下标。
int* stack_index = malloc(sizeof(int)*TSize);
*returnSize = TSize;
result[TSize-1] = 0;
// 栈顶指针。
int top = 0;
for (int i = 0; i < TSize; i++)
result[i] = 0;
for (int i = 0; i < TSize; i++) {
// 若当前元素大于栈顶元素,栈顶元素出栈。即温度升高了,所求天数为两者下标的差值。
while (top > 0 && T[i] > T[stack_index[top-1]]) {
result[stack_index[top-1]] = i-stack_index[top-1];
top--;
}
// 当前元素入栈。
stack_index[top] = i;
top++;
}
return result;
}
附录
- 我的个人博客:messi1002.top
- 如有错误或疑惑之处 请联系 wjymessi@163.com
- 所有题目解答:fork me on github