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^5
  • 30 <= 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;
}

posted @ 2023-12-12 19:26  CV小能手chh  阅读(15)  评论(0)    收藏  举报  来源