import java.util.*; public class Solution { public static int minMeetingRooms(int[][] intervals) { if (intervals == null || intervals.length == 0) return 0; Arrays.sort(intervals, (a, b) -> a[0] - b[0]); PriorityQueue<Integer> heap = new PriorityQueue<>(); heap.add(intervals[0][1]); for (int i = 1; i < intervals.length; i++) { if (intervals[i][0] >= heap.peek()) { heap.poll(); } heap.add(intervals[i][1]); } return heap.size(); } public static void main(String[] args) { int[][] intervals = {{0, 30}, {5, 10}, {15, 20}}; System.out.println(minMeetingRooms(intervals)); } }
The code sorts intervals by start time and uses a min-heap to track end times of meetings currently occupying rooms. When a meeting starts after or exactly when the earliest meeting ends, that room can be reused (poll from heap). Otherwise, a new room is needed (add to heap). The heap size at the end is the minimum rooms required.
For the input intervals, two meetings overlap, so minimum rooms required is 2.
The priority queue keeps track of the earliest finishing meeting currently occupying a room. This helps decide if the next meeting can reuse that room or if a new room is needed.
import java.util.*; public class Solution { public static int minMeetingRooms(int[][] intervals) { if (intervals == null || intervals.length == 0) return 0; Arrays.sort(intervals, (a, b) -> a[0] - b[0]); PriorityQueue<Integer> heap = new PriorityQueue<>(); heap.add(intervals[0][1]); for (int i = 1; i < intervals.length; i++) { if (intervals[i][0] >= heap.peek()) { heap.poll(); } heap.add(intervals[i][1]); } return heap.size(); } public static void main(String[] args) { int[][] intervals = {{1, 5}, {2, 6}, {4, 8}, {9, 10}}; System.out.println(minMeetingRooms(intervals)); } }
The meetings [1,5], [2,6], and [4,8] overlap partially, requiring 3 rooms. The meeting [9,10] starts after all others end, so it can reuse a room.
import java.util.*; public class Solution { public static int minMeetingRooms(int[][] intervals) { if (intervals == null || intervals.length == 0) return 0; Arrays.sort(intervals, (a, b) -> a[1] - b[1]); PriorityQueue<Integer> heap = new PriorityQueue<>(); heap.add(intervals[0][1]); for (int i = 1; i < intervals.length; i++) { if (intervals[i][0] >= heap.peek()) { heap.poll(); } heap.add(intervals[i][1]); } return heap.size(); } public static void main(String[] args) { int[][] intervals = {{0, 30}, {5, 10}, {15, 20}}; System.out.println(minMeetingRooms(intervals)); } }
The code sorts intervals by their end time instead of start time. This breaks the logic because we need to process meetings in order of their start times to correctly allocate rooms.
int[][] intervals = { {0, 10}, {5, 15}, {10, 20}, {15, 25}, {20, 30}, {25, 35}, {30, 40}, {35, 45}, {40, 50}, {45, 55} };
The intervals overlap in a way that at most 5 meetings happen simultaneously. For example, meetings starting at 0,5,10,15,20 overlap partially, requiring 5 rooms.
