zoukankan      html  css  js  c++  java
  • 每日温度-算法详细分析

    每日温度:

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

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

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

    import java.util.Stack;
    
    /**
    
    @author cosefy
    
    @date 2020/6/11
    
    */
    public class DailyTemperature {
    public static void main(String[] args) {
        int[] T = {73, 74, 75, 71, 69, 72, 76, 73}; //结果:1 1 4 2 1 1 0 0
        int[] Tem1 = dailyTemperature_Test1(T);
        int[] Tem2 = dailyTemperature_Test2(T);
        for (int i : Tem1) {
            System.out.print(i + " ");
        }
        System.out.println("");
        System.out.println("------------------");
        for (int i : Tem2) {
            System.out.print(i + " ");
        }
    }
    
    
    
    解法一:暴力解法

    思路:双重循环遍历数组,找到当前元素后面第一个大于它的元素,就跳出循环,找不到默认为0.
    分析:时间复杂度为O(n*n),空间复杂度为O(n).效率比较低

    public static int[] dailyTemperature_Test1(int[] T) {
        int[] res = new int[T.length];
        for (int i = 0; i < T.length; i++) {
            for (int j = i + 1; j < T.length; j++) {
                if (T[i] < T[j]) {
                    res[i] = j - i;
                    break;
                }
            }
        }
        return res;
    }
    
    解法二:利用栈的辅助

    思路:此处栈中只存数组下标,并且下标所代表的元素是递减的。遍历数组,如果栈不空,且当前元素大于栈顶元素,则出栈,
    计算下标差值存入返回数组,直到栈顶元素大于当前元素或栈为空;如果栈为空,或者栈顶元素大于当前元素,则把当前元素
    的下标入栈.
    分析:时间复杂度O(n),空间复杂度O(n)

    public static int[] dailyTemperature_Test2(int[] T) {
        int[] res  = new int[T.length];    //返回数组
        Stack<Integer> stack = new Stack<>();  
        for (int i = 0; i < T.length; i++) {
            while(!stack.isEmpty() && T[i]>T[stack.peek()]){
                int record_num = i-stack.peek();       //while每次循环中,不要出栈两次
                res[stack.pop()]=record_num;
            }
            stack.push(i);
        }
        return res;
    }
    
    }
    
  • 相关阅读:
    jmeter中设置线程数与设置集合点的区别
    在linux系统中如何通过shell脚本批量设置redis键值对
    服务器带宽上行与下行的区别
    性能测试之Jmeter插件安装
    sqlserver 启用邮箱服务
    sqlserver 自定义字符串分割函数.
    C# 重写思想
    CSS控制鼠标滑过时的效果
    js实现图片自动切换效果。
    SQL Server Management Studio 使用作业实现数据库备份
  • 原文地址:https://www.cnblogs.com/cosefy/p/13097375.html
Copyright © 2011-2022 走看看