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.
Example 1:
Input: ["23:59","00:00"]
Output: 1
Note:
  1. The number of time points in the given list is at least 2 and won't exceed 20000.
  2. The input time is legal and ranges from 00:00 to 23:59.
Despite being a medium-complexity problem, there is a way to do it in linear time using concepts of DP:

  • 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(IList timePoints)
 {
  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;
 }
}

Comments

  1. Nicely done! Since the input size is so small, I've decided to use a sort-based approach:
    1) 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

    ReplyDelete

Post a Comment

Popular posts from this blog

Advent of Code - Day 6, 2024: BFS and FSM

Advent of Code - Day 7, 2024: Backtracking and Eval

Golang vs. C#: performance characteristics (simple case study)