剑指 Offer II 035. 最小时间差

剑指 Offer II 035. 最小时间差

原题

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

提示:

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

解题思路

先分析下给定两个时间, 如何找到这两个时间的最小时间差。

设时间 t1、 t2, 时间差 diff; (以同一天为标准, t1 < t2)。

在下面的表述中, 我们使用分钟表示。

  • 如果计算当天的 t1, t2 之间的时间差,则 diff1 = t2 - t1;

  • 如果如果计算隔天 t1、t2 的时间差,由于 t2 > t1,如果 t2 在第二天,t1 在第一天,则 diff2 = diff1 + 1440;这个比第一种情况的差值要大。因此,我们只考虑 t1 在第一天, t2 在第二天,则 diff2 = abs(diff1 - 1440);

时间差同一天相隔一天
difft2 - t1abs(t2 - t1 - 1440)

对上述计算出的 diff1、diff2, 我们取最小值。由此,我们得到最小时间差: res = min(diff1, diff2);

假设存在多个时间,t1 < t2 < t3 < t4… < tn, 我们只考虑相邻的时间, 和差值最大的两个时间 (t1tn), 因为只有这些情况中, 才会出现最小值。

完整代码

class Solution {
		public int findMinDifference(List<String> timePoints) {
            int len = timePoints.size();
			int[] arr = new int[len];
			for (int i = 0; i < len; i++) {
				String[] split = timePoints.get(i).split(":");
				int hour = Integer.parseInt(split[0]);
				int minute = Integer.parseInt(split[1]);
				arr[i] = 60 * hour + minute;
			}
			Arrays.sort(arr);
			int result = Integer.MAX_VALUE;
            // 求相邻的两个时间的最小时间差
			for (int i = 1; i < len; i++) {
				result = Math.min(Math.min(arr[i] - arr[i-1], Math.abs(arr[i]- arr[i-1]-1440)), result);
                if (result == 0) {
                    return 0;
                }
			}
            // 如果求当天的时间差, 则相邻的时间会更短
			result = Math.min(result, Math.abs(arr[len - 1] - arr[0]-1440));
			return result;
		}
	}

其他

这道题目给出的不一样的地方就在于, 我们可以横跨一个周期,这里的周期是 24小时;求差值最小,可以把一个时间当成同一周期,也可以当成第二周期,关键是找到两者的最小值。

本题解同步至剑指offer专项突击版仓库内, 欢迎查看。

我的力扣主页

Github仓库

Gitee仓库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值