c语言 739. 每日温度
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 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]
提示:
1 <= temperatures.length <= 10^530 <= temperatures[i] <= 100
解题思路:
一.暴力穷举
每一个元素都对数组进行查找比它大的第一个元素,最坏情况时间复杂度O(n^2)
二.单调栈
使用一个栈s来存储没有找到比它大的第一个元素的下标,比较栈顶元素temp[s[top]]和当前元素temp[i]的大小,如果大于栈顶元素,则栈顶出栈并计算间隔天数,直至栈顶大于当前元素或者栈空(temp[s[top]]=i-s[top]),然后将当前元素入栈;如果小于栈顶元素,则元素入栈。按以上规则生成的是一个自栈底单调递减的栈,它保存了遍历过的每一个当前没有找到比它大的第一个元素的信息,因此只需要遍历一遍即可,时间复杂度O(n),空间复杂度O(n)。
代码
int *dailyTemperatures(int *temperatures, int temperaturesSize, int *returnSize)
{
int *s = (int *)malloc(temperaturesSize * sizeof(int));//栈
*returnSize = temperaturesSize;
int end = -1, top = 0;//栈顶和栈底
int *re = (int *)malloc(temperaturesSize * sizeof(int));
for (int i = 0; i < temperaturesSize; i++)
re[i] = 0;//初始化
s[0] = 0;//第一个元素入栈,作为比较对象
int j = 0;
for (int i = 1; i < temperaturesSize; i++)
{
if (temperatures[i] > temperatures[s[top]])
{
while (end < top && temperatures[i] > temperatures[s[top]])
{
re[s[top]] = i - s[top];
top--;
}
s[++top] = i;
}
else
{
s[++top] = i;
}
}
return re;
}

浙公网安备 33010602011771号