厚积薄发打卡Day102:哈希表(七)<最小时间差>

最小时间差

给定一组范围在00:00至23:59的时间,求任意两个时间之间的最小时间差。例如,输入时间数组[“23:50”,“23:59”,“00:00”],"23:59"和"00:00"之间只有1分钟的间隔,是最小的时间差。

思路

  • 题目中要求求分钟的最小时间差,计算得出一天有24*60 = 1440min,因此可以创建一个长度为1440的数组容器当作映射表,并把字符串时间存入数组中:
    • 数组下标:一天的分钟数
    • 数组的值:是否出现了这个时间
  • 接下来只要遍历容器,比较数组值为true的下标,求最小值即可
  • 需要注意“00:00”这个时间节点,需要往后遍历而不是到回首位进行差值比较

实现

public class MyFindMinInterval {
    public static int findMinDifference(List<String> timePoint) {
        //如果超过1440那必须有两个时间点相同,直接返回0即可
        if (timePoint.size() > 1440) {
            return 0;
        }
        //创建1441为了兼容第二天的00:00
        boolean[] minuteContainer = new boolean[1441];
        //遍历时间存入数组
        for (String time : timePoint) {
            String[] t = time.split(":");
            //计算分钟
            int min = Integer.parseInt(t[0]) * 60 + Integer.parseInt(t[1]);
            //如果存在00:00则直接放入最后一位即可
            if (min == 0) {
                minuteContainer[1440] = true;
            } else {
                //否则常规放入固定位置
                if (minuteContainer[min]) {
                    return 0;
                }
                minuteContainer[min] = true;
            }
        }
        return findMinDifference0(minuteContainer);
    }

    private static int findMinDifference0(boolean[] minuteContainer) {
        //默认min为最大值
        int minDiff = minuteContainer.length - 1;
        //是否存在上一位,有上一位的下标才能进行计算
        int prev = -1;
        for (int i = 1; i < minuteContainer.length; i++) {
            //如果存在该时间点,则取出对应的下标(分钟)进行计算
            if (minuteContainer[i]) {
                if (prev >= 0) {
                    //不断赋值比较取出最小值
                    minDiff = Math.min(i - prev, minDiff);
                }
                prev = i;
            }
        }
        return minDiff;
    }
}

验证

public static void main(String[] args) {
    List<String> timePoints = new ArrayList<>(Arrays.asList("23:50", "20:59", "21:59", "23:59", "00:00"));
    List<String> timePoints2 = new ArrayList<>(Arrays.asList("23:50", "20:59", "21:59", "23:59"));
    System.out.println(findMinDifference(timePoints)); //1
    System.out.println(findMinDifference(timePoints2));//9
}

验证结果没毛病😆

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值