Minimum Time Difference - DP(ish) solution
Problem is here: https://leetcode.com/problems/minimum-time-difference/description/
Given a list of 24-hour clock time points in "Hour:Minutes" format, find the minimum minutes difference between any two time points in the list.
Given a list of 24-hour clock time points in "Hour:Minutes" format, find the minimum minutes difference between any two time points in the list.
Example 1:
Input: ["23:59","00:00"] Output: 1
Note:
- The number of time points in the given list is at least 2 and won't exceed 20000.
- The input time is legal and ranges from 00:00 to 23:59.
- Basically the input range is very small: it fits into a 1500 array
- Create a bool array of this size and map each time to it
- If the time has already been set, return 0 (that's the min)
- This cost linear time and constant space (O(1500))
- Next traverse the array and compare the two adjacent cells that have a time on it
- Some extra check is needed for the boundary case when the min diff crosses the day line
That's it! Cheers, Marcelo
public class Solution { public int FindMinDifference(IListtimePoints) { if (timePoints == null) return 0; bool[] map = new bool[1500]; int min = Int32.MaxValue; int max = Int32.MinValue; foreach (string t in timePoints) { string[] parts = t.Split(':'); int val = Int32.Parse(parts[0]) * 60 + Int32.Parse(parts[1]); if (map[val]) return 0; map[val] = true; min = Math.Min(min, val); max = Math.Max(max, val); } int solution = Math.Abs(24 * 60 - (max - min)); int previousIndex = min; for (int i = min + 1; i < map.Length; i++) { if (map[i]) { solution = Math.Min(solution, i - previousIndex); previousIndex = i; } } return solution; } }
Nicely done! Since the input size is so small, I've decided to use a sort-based approach:
ReplyDelete1) convert all times to minutes
2) sort all the times
3) find the minimum difference between 2 successive times and compare it with the corner case where the time between the largest and smallest times is the smallest. The code in Rust is below:
impl Solution {
pub fn find_min_difference(time_points: Vec) -> i32 {
fn to_minutes(time: &str) -> i32 {
let parts: Vec<_> = time.split(":").collect();
let hours: i32 = parts[0].parse().unwrap();
let minutes: i32 = parts[1].parse().unwrap();
hours * 60 + minutes
}
let mut minutes: Vec<_> = time_points.iter().map(|t| to_minutes(&t)).collect();
minutes.sort_unstable();
std::cmp::min(
minutes.iter().zip(minutes.iter().skip(1)).map(|(x, y)| y - x).min().unwrap(),
minutes[0] + 1440 - minutes.last().unwrap(),
)
}
}
https://gist.github.com/ttsugriy/81bd95b2781a57065580789fba4f80a2
Cheers,
Taras