最小时间差

        首先可以想到,可以计算出任意两个时间之间的差值,然后比较出最小的,不过这种蛮力方法时间复杂度是O(n^2)。而先将时间列表排序,再计算相邻两个时间的差值,就只需要计算n个差值,而排序阶段时间复杂度通常为O(nlogn),所以优化后的时间复杂度为O(nlogn)。

        不过需要注意的是还需要考虑第一个和最后一个时间点跨越午夜的时间差的大小。并且一天只有1440分钟,如果时间列表大于1440,那么必然有重复的时间点,最小差值即为0。

        

class Solution {
    public int findMinDifference(List<String> timePoints) {
        int n = timePoints.size();
        // 由于一天最多有1440分钟,如果timePoints超过1440个,那么必然有重复的时间点,最小差值为0
        if (n > 1440) {
            return 0;
        }

        // 将时间点按字符串排序,默认是按HH:MM的字典顺序排序
        Collections.sort(timePoints);

        int ans = Integer.MAX_VALUE;
        // 获取第一个时间点的分钟数
        int t0Minutes = getMinutes(timePoints.get(0));
        // 初始化上一个时间点为第一个时间点
        int preMinutes = t0Minutes;

        // 从第二个时间点开始,逐个计算与前一个时间点的时间差
        for (int i = 1; i < n; ++i) {
            int minutes = getMinutes(timePoints.get(i));
            // 计算相邻时间点的时间差并保留最小的
            ans = Math.min(ans, minutes - preMinutes); 
            preMinutes = minutes; // 更新上一个时间点为当前时间点
        }

        // 计算第一个和最后一个时间点跨越午夜的时间差
        ans = Math.min(ans, t0Minutes + 1440 - preMinutes);

        return ans;
    }

    // 将时间点转换为分钟数的方法,比如输入“10:01”返回601
    public int getMinutes(String t) {
        return ((t.charAt(0) - '0') * 10 + (t.charAt(1) - '0')) * 60 + 
               ((t.charAt(3) - '0') * 10 + (t.charAt(4) - '0'));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不过是条河鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值