算法小知识-------01.18-------最小时间差

111 阅读1分钟

这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战

最小时间差

该题出自力扣的539题——最小时间差(中等题)

审题

给定一个 24 小时制(小时:分钟 "HH:MM")的时间列表, 找出列表中任意两个时间的最小时间差并以分钟数表示。 输入:timePoints = ["23:59","00:00"] 输出:1

  • 题目含义相对简单,就是给出一个字符串集合,集合内存放指定格式的时间字符串,找出其中相差最短的时间,返回分钟为单位。

  • 初看题意相对还是比较简单的,就算用暴力循环也能冲出来。

  • 题解:

    • 定义一个存放分钟的整型数组
    • 循环给定的集合,并且对字符串分割转换为分钟,存进整型数组
    • 对数组进行排序,方便对于计算最小值
    • 循环数组,用Math.min方法拿到最小值
    • 因为时间是一个循环,00:00其实也是24:00,所以return也要做一个Math.min对数组的首尾,这也是上述排序的好处。

编码

    public static int findMinDifference(List<String> timePoints) {
        int[] arr = new int[timePoints.size()];
        for (int i = 0; i < arr.length; i++) {
            String[] time = timePoints.get(i).split(":");
            if (time[0] .equals( "00" )&& time[1] .equals( "00")){
                arr[i] = 1440;
            }else {
                arr[i] = Integer.valueOf(time[0]) * 60 + Integer.valueOf(time[1]);
            }
        }
        Arrays.sort(arr);
        Integer min = Integer.MAX_VALUE;
        for (int i = 1; i < arr.length; i++) {
            min = Math.min(min, arr[i] - arr[i - 1]);
        }
        return Math.min(min, arr[0] + 1440 - arr[arr.length - 1]);
    }
​

35698a201870940d39738392f9786e1.png

彩蛋篇

  • 当前的做法,其实时间复杂度和空间复杂度会相对偏高,转换需要一个for循环;排序sort方法底层需要nLog;最后比较也需要一个for循环;取最高也就是sort方法的nLogn。
  • 空间复杂度也是取自sort方法的入栈。
  • 但是相对测试用例来说,还是有办法优化的,不过仅仅是面向测试用例。(感谢评论区,简直是有趣)
  • 至于为什么呢,是因为鸽巢原理 —— 如果集合的长度 > 1440,也就是每个时间段都会存在且必然会有两个相同的时间,此时可以直接返回 0。
    • 在首行添加代码
       if (timePoints.size() > 1440) {
            return 0;
        }
    

5bbcc69c15ac6c882455d886450c7c0.png