美文网首页
算法—每日气温

算法—每日气温

作者: 土豆骑士 | 来源:发表于2020-04-25 10:44 被阅读0次

    根据每⽇⽓温列表,请重新⽣生成⼀一个列表,对应位置的输入是你需要再等待多久温度才会升⾼超过该⽇日的天数。如果之后都不会升高,请在该位置0来代替。
    例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],
    你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。

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

    解析:本质是找当前元素 从[i,TSize] 找到大于该元素时. 数了几次. 首先最后一个元素默认是0,因为它后面已经没有元素了。

    1、暴力法

    • 从左到右开始遍历,从第一个数到最后一个数开始遍历. 最后一个数因为后面没有元素,默认是0,不需要计算;
    • 从[i+1,TSize]遍历,每个数直到找到比它大的数,数的次数就是对应的值;

    思路:

    1. 创建一个数组result;默认reslut[TSize-1] = 0;
    2. 从0个元素遍历到最后一个元素[0,TSize-1];
      2.1. 如果当前i >0 并且当前的元素和上一个元素相等,则没有必要继续循环. 则判断一下result[i-1]是否等于0,如果等于则直接将result[i] = 0,否则将result[i] = result[i-1]-1;
      2.2. 遍历元素[i+1,TSize], 如果当前T[j]>T[i],则result[i] = j-i; 如果当前T[j]已经是最后一个元素,则默认result[i] = 0;


      气温表和result表
    int  *dailyTemperatures_1(int* T, int TSize, int* returnSize){
        
        int *result = malloc(sizeof(int) * 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;
    }
    
    2、跳跃对比(优化暴力法,减少遍历次数)

    解析:
    1.从右到左遍历. 因为最后一天的气温不会再升高,默认等于0;
    2.i从[TSize-2,0]; 从倒数第二天开始遍历比较. 每次减一;
    3.j 从[i+1,TSize]遍历, j+=result[j],可以利用已经有结果的位置进行跳跃,从而减少遍历次数,若T[i]<T[j],那么Result = j - I,若reuslt[j] == 0,则表示后面不会有更大的值,那么当前值就应该也是0;

    思路:
    1. 创建一个result 数组,默认reslut[TSize-1] = 0;
    2. 从TSize-2个元素遍历到第一个元素[TSize-2,0];
    3. 从[i+1,TSize]遍历,j+=result[j]; 若T[i]<T[j],那么Result = j - I; 若reuslt[j] == 0,则表示后面不会有更大的值,那么当前值就应该也是0;
    跳跃对比
    int  *dailyTemperatures_2(int* T, int TSize, int* returnSize){
        
        int *result = (int *)malloc(sizeof(int) * TSize);
        *returnSize = TSize;
        result[TSize-1] = 0;
        
        for (int i = TSize - 2; i >= 0; i--) {
            
            for (int j = i + 1; j < TSize; j = j + result[j]) {
                if (T[i] < T[j]) {
                    result[i] = j-i;
                    break;
                } else {
                    if (result[j] == 0) {
                        result[i] = 0;
                        break;
                    }
                }
            }
        }
        return result;
    }
    

    3、利用栈思想解决

    思路:
    1. 初始化一个栈(用来存储索引),value数组
    2. 栈中存储的是元素的索引值index;
    3. 遍历整个温度数组从[0,TSize];
      (1).如果栈顶元素<当前元素,则将当前元素索引index-栈顶元素index,计算完毕则将当前栈顶元素移除,将当前元素索引index 存储到栈中; 出栈后,只要栈不为空.继续比较,直到栈顶元素不能满足T[i] > T[stack_index[top-1]]
      (2).如果当前的栈为空,则直接入栈;
      (3).如果当前的元素小于栈顶元素,则入栈
      (4).while循环结束后,当前元素也需要入栈;
    int* dailyTemperatures_31(int* T, int TSize, int *returnSize) {
        
        int *result = malloc(sizeof(int)*TSize);
        int *stack_index = malloc(sizeof(int)*TSize);// 用栈记录T的下标。
        *returnSize = TSize;
    
        int top  = 0;
        int tIndex = 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]]) {
                
                tIndex = stack_index[top-1];
                result[tIndex] = i - tIndex;
                top--;//出栈
            }
            stack_index[top] = i;// 当前元素index入栈。
            top++;
        }
        return result;
    }
    

    相关文章

      网友评论

          本文标题:算法—每日气温

          本文链接:https://www.haomeiwen.com/subject/kokhwhtx.html