using System; using System.Collections.Generic; public class Solution { public int MinMeetingRooms(int[][] intervals) { if (intervals.Length == 0) return 0; int[] starts = new int[intervals.Length]; int[] ends = new int[intervals.Length]; for (int i = 0; i < intervals.Length; i++) { starts[i] = intervals[i][0]; ends[i] = intervals[i][1]; } Array.Sort(starts); Array.Sort(ends); int rooms = 0, endPtr = 0; for (int i = 0; i < starts.Length; i++) { if (starts[i] < ends[endPtr]) { rooms++; } else { endPtr++; } } return rooms; } } public class Program { public static void Main() { var solution = new Solution(); int[][] meetings = new int[][] { new int[] {0, 30}, new int[] {5, 10}, new int[] {15, 20} }; Console.WriteLine(solution.MinMeetingRooms(meetings)); } }
The code sorts start and end times separately. It then uses two pointers to track ongoing meetings. When a meeting starts before the earliest ending meeting ends, it needs a new room. Otherwise, a room is freed.
For the given intervals, two meetings overlap, so minimum rooms required is 2.
using System; using System.Collections.Generic; public class Solution { public int MinMeetingRooms(int[][] intervals) { if (intervals.Length == 0) return 0; int[] starts = new int[intervals.Length]; int[] ends = new int[intervals.Length]; for (int i = 0; i < intervals.Length; i++) { starts[i] = intervals[i][0]; ends[i] = intervals[i][1]; } Array.Sort(starts); Array.Sort(ends); int rooms = 0, endPtr = 0; for (int i = 0; i < starts.Length; i++) { if (starts[i] < ends[endPtr]) { rooms++; } else { endPtr++; } } return rooms; } } public class Program { public static void Main() { var solution = new Solution(); int[][] meetings = new int[][] { new int[] {1, 2}, new int[] {3, 4}, new int[] {5, 6} }; Console.WriteLine(solution.MinMeetingRooms(meetings)); } }
Since no meetings overlap, only one room is needed to hold all meetings sequentially.
using System; public class Solution { public int MinMeetingRooms(int[][] intervals) { int[] starts = new int[intervals.Length]; int[] ends = new int[intervals.Length]; for (int i = 0; i < intervals.Length; i++) { starts[i] = intervals[i][0]; ends[i] = intervals[i][1]; } Array.Sort(starts); Array.Sort(ends); int rooms = 0, endPtr = 0; for (int i = 0; i < starts.Length; i++) { if (starts[i] < ends[endPtr]) { rooms++; } else { endPtr++; } } return rooms; } }
The for loop uses i <= intervals.Length which tries to access an index equal to intervals.Length, which is out of bounds.
Sorting start and end times separately allows us to use two pointers to efficiently find overlaps by comparing the earliest start with the earliest end.
using System; using System.Collections.Generic; public class Solution { public int MinMeetingRooms(int[][] intervals) { if (intervals.Length == 0) return 0; int[] starts = new int[intervals.Length]; int[] ends = new int[intervals.Length]; for (int i = 0; i < intervals.Length; i++) { starts[i] = intervals[i][0]; ends[i] = intervals[i][1]; } Array.Sort(starts); Array.Sort(ends); int rooms = 0, endPtr = 0; for (int i = 0; i < starts.Length; i++) { if (starts[i] < ends[endPtr]) { rooms++; } else { endPtr++; } } return rooms; } } public class Program { public static void Main() { var solution = new Solution(); int[][] meetings = new int[][] { new int[] {1, 10}, new int[] {2, 7}, new int[] {3, 19}, new int[] {8, 12}, new int[] {10, 20}, new int[] {11, 30} }; Console.WriteLine(solution.MinMeetingRooms(meetings)); } }
By sorting starts and ends, the code counts maximum overlaps. The peak overlap is 4 meetings at once.
