一起刷力扣之【539. 最小时间差】

672

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

题目

给定一个 24 小时制(小时:分钟  "HH:MM" )的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。

示例

输入: timePoints = ["23:59","00:00"]
输出: 1
输入: timePoints = ["00:00","23:59","00:00"]
输出: 0

提示

  • 2 <= timePoints.length <= 2 * 104^4
  • timePoints[i] 格式为  "HH:MM"

解题思路

题目中给出的是小时+分钟格式的字符串,我们要计算最小时间差的话,还需要将其转换成数值类型才能进行比较。

  1. 只有小时+分钟,那么我们可以将其拆分成两部分,然后将 小时 * 60 得出对应的分钟数,再加上后面分钟部分即可得到最终数值。
  2. 一天24小时,换算成分钟的话只有1440分钟,如果timePoints的长度超过1440的话,我们就可以直接返回0,因为此时必定有重复的时间,其差距为0。
  3. 先将时间点进行排序,再遍历时间点,计算两个时间点直接的时间差。
  4. 23:00 - 00:00的情况需要单独做处理。

代码实现

class Solution {
    public int findMinDifference(List<String> timePoints) {
        // 边界判断,超过1440个时间点的,直接返回0
        if(timePoints.size() > 1440){
            return 0;
        }
        
        // 按照时间大小进行排序,方便后面时间差的比较
        Collections.sort(timePoints);
        // 初始值
        int pre = getTime(timePoints.get(0).split(":")), min = 1440;
        
        // 遍历后续时间点
        for(int i = 1; i < timePoints.size(); ++i){
            // 计算总分钟数
            int time = getTime(timePoints.get(i).split(":"));
            // 更新最小时间差
            min = Math.min(min, time - pre);
            // 更新前一时间点
            pre = time;
        }
        
        // 将最后一个时间点与第一个时间点做比较,例如23:00 - 00:00,之间点时间差为1
        min = Math.min(min, getTime(timePoints.get(0).split(":")) + 1440 - pre);
        // 返回结果
        return min;
    }

    private int getTime(String[] time){
        // 小时 * 60 + 分钟
        return Integer.parseInt(time[0]) * 60 + Integer.parseInt(time[1]);
    }
}