每日的温度

Posted shwzh1990

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日的温度相关的知识,希望对你有一定的参考价值。

描述

根据每日 气温列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0来代替。

例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]

提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在[30, 100] 范围内的整数。

来源:力扣(LeetCode)

 

 

这道题不能用暴力方式解决 因为第35个题目会卡住, 大神用的是单调栈的方式

所谓的单调栈指的是  https://www.bilibili.com/video/av66395810/

  • 单调栈里的元素具有单调性
  • 元素加入栈前,会在栈顶端把破坏栈单调性的元素都删除
  • 使用单调栈可以找到元素向左遍历第一个比他小的元素,也可以找到元素向左遍历第一个比他大的元素
    • 当单调栈中的元素是单调递增的时候,根据上面我们从数组的角度阐述单调栈的性质的叙述,可以得出:
      • 当a > b 时,则将元素a插入栈顶,新的栈顶则为a
      • 当a < b 时,则将从当前栈顶位置向前查找(边查找,栈顶元素边出栈),停止查找,将元素a插入栈顶(在当前找到的数之后,即此时元素a找到了自己的“位置”)

 

#define OK 0
#define NULL 0

typedef int DataType;
typedef struct node{
    DataType data;
    struct node * next;
}Stack;

//创建栈,此时栈中没有任何元素
Stack* CreateStack()
{
    Stack *stack = (Stack*)malloc(sizeof(Stack));
    if(NULL != stack)
    {
       stack->next = NULL;
       return stack;
    }
    return NULL;
}

//撤销栈
void DestoryStack(Stack* stack)
{
    free(stack);
}
 
int IsEmpty(Stack* stack)
{
    return (stack->next == 0);
}
 
//入栈,成功返回1,失败返回0, 把元素 data 存入 栈 stack 中
int PushStack(Stack* stack, DataType data)
{
    Stack* newst = (Stack*)malloc(sizeof(Stack));
    if(NULL != newst)
    {
        newst->data = data;
        newst->next = stack->next;  //s->next = NULL;
        stack->next = newst;
        return 1;
    }
    return 0;
}
 
/*
    出栈,成功返回1,失败返回0,出栈不取出元素值,只是删除栈顶元素。
    如出栈要实现,取出元素值,并释放空间,可结合取栈顶元素函数做修改,这里不再给出。
 */
 
int PopStack(Stack* stack)
{
    Stack* tmpst;
    if(!IsEmpty(stack))
    {
        tmpst = stack->next;
        stack->next = tmpst->next;
        free(tmpst);
        return 1;
    }
    return 0;
}

int PopStackReturn(Stack* stack, DataType *data)
{
    Stack* tmpst;
    if(!IsEmpty(stack))
    {
        tmpst = stack->next;
        stack->next = tmpst->next;
        *data = tmpst->data;
        free(tmpst);
        return 1;
    }
    return 0;
}
 
//取栈顶元素,仅取出栈顶元素的值,取出之后,该元素,任然存在栈中。成功返回元素值,失败输出提示信息,并返回 -1
DataType GetTopElement(Stack* stack)
{
    if(!IsEmpty(stack))
    {
        return stack->next->data;
    }
    return -1;
}


int* dailyTemperatures(int* T, int TSize, int* returnSize) 
{
    int i;
    int temp;
    int topData;
    int ret;
    int *NewT = malloc(TSize * sizeof(int));
    if (NewT == NULL) 
    {
        printf("malloc fail");
        return NULL;
    }
    memset(NewT, 0, TSize * sizeof(int));

    Stack* stack = CreateStack();
    if (stack == NULL) 
    {
        printf("CreateStack fail");
        return NULL;
    }
    for (i = 0; i < TSize; i++) 
    {
        while (!IsEmpty(stack) && (T[i] > T[GetTopElement(stack)])) 
        {
            temp = GetTopElement(stack);
            NewT[temp] = i - temp;
            PopStack(stack);
        }
        PushStack(stack, i);
    }
    
    DestoryStack(stack);
    *returnSize = TSize;
    return NewT;
}

本题的解题思路在于:

首先把请看

  while (!IsEmpty(stack) && (T[i] > T[GetTopElement(stack)])) 
如果我们的遇到的元素大于栈顶的元素则把栈顶的元素弹出来,最后把新的最大的值放进去,然后每次小于这个元素的值会放进去,那么我们每次只是遍历了一次最大的值而不重复。

主要的问题是什么时候用单调栈 这个还是由于编程太少的原因造成的。

以上是关于每日的温度的主要内容,如果未能解决你的问题,请参考以下文章

Java每日一题——>739. 每日温度(蛮力法,栈方法)

Java每日一题——>739. 每日温度(蛮力法,栈方法)

代码随想录算法训练营第五十八天|739.每日温度496.下一个更大元素Ⅰ

分享几个实用的代码片段(附代码例子)

分享几个实用的代码片段(附代码例子)

Leetcode-739.每日温度(双思路分析)