原贴地址:https://dawnmagnet.github.io/algorithm-station/docs/2022/1/18
给定一个 24 小时制(小时:分钟 “HH:MM”)的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。
示例 1:
输入:timePoints = ["23:59","00:00"]
输出:1
示例 2:
输入:timePoints = ["00:00","23:59","00:00"]
输出:0
提示:
- 2 <= timePoints <= 2 * 104
- timePoints[i] 格式为 “HH:MM”
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-time-difference
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路分析 #
首先使用一个函数将日期转化成指定分钟的数字,然后将这个数字对应到一个1440(24*60)长度的布尔数组中,然后去枚举布尔数组哪里有值。本来也可以使用一个数组去排序,但数据量太小了(1440),排序也没什么必要。
放到数组里面之后,因为有两种可能,一种是两个有效值之间的间隔,一种是第一个值和最后一个值的间隔。所以在判断的时候需要多加注意
Rust代码 #
pub fn parse(s: &str) -> usize {
let mut res = 0;
let b: Vec<usize> = s.as_bytes().iter().map(|&x| x as usize - 48).collect();
(b[0] * 10 + b[1]) * 60 + b[3] * 10 + b[4]
}
impl Solution {
pub fn find_min_difference(time_points: Vec<String>) -> i32 {
let mut c = [false; 1440];
for item in &time_points {
let pos = parse(item);
if c[pos] {
return 0;
} else {
c[parse(item)] = true;
}
}
let mut cur = usize::MAX;
let mut res = 10000;
let mut first = 0;
for time in 0..1440 {
if c[time] {
if cur == usize::MAX {
cur = time;
first = time + 1440;
} else {
res = res.min(time - cur);
cur = time;
}
}
}
res = res.min(first - cur);
res as i32
}
}