539. 最小时间差
一、题目
1.题目描述
给定一个 24 小时制(小时:分钟
"HH:MM"
)的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。
-
示例 1:
输入:timePoints = ["23:59","00:00"] 输出:1
-
示例 2:
输入:timePoints = ["00:00","23:59","00:00"] 输出:0
-
提示:
2 <= timePoints.length <= 2 * 10^4
timePoints[i]
格式为"HH:MM"
2.基础框架
C++基础框架代码如下:
int findMinDifference(vector<string>& timePoints) {
}
3.解题思路
- 题目分析
-
题目目标是以分钟数形式返回最小时间差。
-
大体思路是排序,然后最小的相邻时间差作为返回值。
-
时钟列表应看作循环的数组,比如
22:00
和1:00
的分钟数最小差值应为3 * 60
,而不是21 * 60
。所以需要定义一个数组的长度为
2 * n - 1
。 -
排序前需要将字符串的时间转换成分钟数。排序的范围为
[0, n)
,[n, 2n - 1)这部分为对称部分,不作为排序的范围。 -
可以对固定的下标位置取出小时和分钟的字符,然后转换成整型分钟数再进行比较。
-
比较的时候会发现,当
"00:00","23:59"
比较的的时候,分钟数差值最小值应为1。假设
a
和b
进行比较:- 当
a > b
时,两者之间的最小分钟数差值为:a - b
; - 当
a < b
,则两者之间的最小分钟数差值为:a + 1440 - b
;
- 当
-
实现代码:
int findMinDifference(vector<string>& timePoints) { int n = timePoints.size(); vector<int> rec(2 * n - 1, -1); int i; for (i = 0; i < n; i++) { int hour, minu; hour = (timePoints[i][0] - '0') * 10; hour += (timePoints[i][1] - '0'); minu = (timePoints[i][3] - '0') * 10; minu += (timePoints[i][4] - '0'); rec[i] = hour * 60 + minu; } sort(rec.begin(), rec.end() - n + 1); int j = 0; for (i = n; i < 2 * n - 1; i++) { rec[i] = rec[j++]; } int min = 1440; for (int i = 1; i < rec.size(); i++) { int tmp; if (rec[i] >= rec[i - 1]) tmp = rec[i] - rec[i - 1]; else { tmp = (rec[i] + 1440) - rec[i - 1]; } if (tmp < min) min = tmp; } return min; }