题目描述:
请根据每日 气温 列表 temperatures ,请计算在每一天需要等几天才会有更高的温度。如果气温在这之后都不会升高,请在该位置用 0 来代替。
示例 1:
输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]
示例 2:
输入: temperatures = [30,40,50,60]
输出: [1,1,1,0]
示例 3:
输入: temperatures = [30,60,90]
输出: [1,1,0]
题目解析:
本题如果采用暴力破解,会超时,因此可以采用单调栈的方式,所谓单调栈就是将温度表中的温度按照逆序(或者顺序)的方式压入栈中,本题中,如果栈中元素为0,则压栈,如果栈中元素不为0,则将待压入的温度与栈顶温度比较,如果小于栈顶温度,则入栈,否则栈顶元素出栈,同时更新返回数组。依次比较,直到遍历完整个原始温度。
int* dailyTemperatures(int* temperatures, int temperaturesSize, int* returnSize){
int top = 0,bootm = 0;
int* ret = (int*)malloc(sizeof(int)*temperaturesSize);
int* stack = (int*)malloc(sizeof(int)*temperaturesSize);
memset(ret,0,sizeof(int)*temperaturesSize);
memset(stack,0,sizeof(int)*temperaturesSize);
int stack_i = 0;
while(top<temperaturesSize){
if(stack_i==0)stack[stack_i++] = top;//若栈中元素为0,则直接入栈
else{
bootm = stack[stack_i-1];
if(temperatures[top]>temperatures[bootm]){//若栈顶元素小于待入栈元素
ret[bootm] = top-bootm;//记录天数
stack[--stack_i] = 0;//出栈
continue;
}else{
stack[stack_i++] = top;//若栈顶元素大于待入栈元素,则入栈
}
}
top++;
}
*returnSize = temperaturesSize;
return ret;
}