Meeting Rooms II

Updated on 12 June, 2025
Meeting Rooms II header image

Problem Statement

Consider you are responsible for assigning conference rooms at a busy company. On a typical day, a variety of meetings need to be scheduled, each defined by a start time (starti) and an end time (endi). You are provided with an array of these meeting time intervals named intervals, where each interval intervals[i] = [starti, endi] represents a single meeting.

The challenge is to find the minimum number of conference rooms required to accommodate all the meetings without any schedule overlap. This means no two meetings can occur in the same room at overlapping times. Your solution should return this minimum number of rooms required based on the provided meeting schedules.

Examples

Example 1

Input:

intervals = [[0,30],[5,10],[15,20]]

Output:

2

Example 2

Input:

intervals = [[7,10],[2,4]]

Output:

1

Constraints

  • 1 <= intervals.length <= 104
  • 0 <= starti < endi <= 106

Approach and Intuition

The key to solving this problem is to understand the dynamics of meeting times: when each meeting starts and ends, and how these times interact with each other. Based on the provided examples and constraints, let's break down our approach:

  1. Recognizing Overlaps: If meetings overlap in time, an additional room is necessary. For example, in the first example, the time [5,10] overlaps with [0,30], indicating a need for an extra room.
  2. Sorting the Meetings: By initially sorting the meetings based on start times or end times, you can systematically determine the availability of rooms as time progresses.
  3. Using a Min-Heap Structure: Implementing a min-heap (or priority queue) helps to dynamically manage the meeting end times. By always ensuring that the room that frees up the earliest is available for the next meeting, we can optimize room usage:
    • For each meeting, check if the room that frees up the earliest (the one with the smallest end time) can accommodate this meeting.
    • If yes, adjust the end time of this room. If no, allocate a new room (push a new end time onto the heap).

When leveraging such a data structure, each operation (adding a room or adjusting an existing room's schedule) can be efficiently handled. This allows for a clear overview of room availability throughout the day, ensuring that the minimum number of rooms is utilized at all times while adhering to the meeting schedules.

Solutions

  • Java
  • Python
java
class Solution {
    public int findMinMeetingRooms(int[][] schedules) {
        if (schedules.length == 0) {
            return 0;
        }

        Integer[] startTime = new Integer[schedules.length];
        Integer[] endTime = new Integer[schedules.length];

        for (int i = 0; i < schedules.length; i++) {
            startTime[i] = schedules[i][0];
            endTime[i] = schedules[i][1];
        }

        Arrays.sort(endTime, new Comparator<Integer>() {
            public int compare(Integer x, Integer y) {
                return x - y;
            }
        });

        Arrays.sort(startTime, new Comparator<Integer>() {
            public int compare(Integer x, Integer y) {
                return x - y;
            }
        });

        int roomCount = 0;
        int startIdx = 0, endIdx = 0;

        while (startIdx < schedules.length) {
            if (startTime[startIdx] >= endTime[endIdx]) {
                roomCount -= 1;
                endIdx++;
            }
            
            roomCount += 1;
            startIdx++;
        }

        return roomCount;
    }
}

The provided Java solution is designed to determine the minimum number of meeting rooms required given an array of meeting times where each meeting time is represented as a start and end time. Here’s a breakdown of the approach taken:

  • The solution first handles the edge case where there are no meetings by returning 0.
  • It initializes two arrays, startTime and endTime, to hold the start and end times of the meetings, respectively.
  • Both these arrays are populated using values from the input array of schedules.
  • The arrays endTime and startTime are then sorted. This sorting helps in comparing the meeting times in a sequential manner.
  • The logic then uses two pointers, startIdx and endIdx, initialized at zero to traverse the startTime and endTime arrays respectively.
  • The main logic of the algorithm is in the tracking of room count while iterating through the start times:
    • If a meeting starts only after the previous meeting in a room has ended, it decreases the room count and moves the endIdx pointer forward.
    • For every meeting starting (as indicated by the startIdx pointer), the room count is increased.
    • This effectively accounts for the overlap of meeting times and the need for additional rooms.
  • Finally, the total number of meeting rooms needed at any point is returned as the answer.

The solution is efficient for it prioritizes sorting and a linear scan through the meeting times, ensuring that the required computational steps are minimized for determining the number of meeting rooms needed.

python
class Solution:
    def findMinRooms(self, time_intervals: List[List[int]]) -> int:
        # If there are no intervals
        if not time_intervals:
            return 0

        room_count = 0

        # Extract start and end times, then sort them
        start_times = sorted(interval[0] for interval in time_intervals)
        end_times = sorted(interval[1] for interval in time_intervals)
        total_intervals = len(time_intervals)

        # Pointer initialization
        end_idx = 0
        start_idx = 0

        # Process each interval
        while start_idx < total_intervals:
            # Check if there's an overlap
            if start_times[start_idx] >= end_times[end_idx]:
                # Room vacated
                room_count -= 1
                end_idx += 1

            # Increment room count
            room_count += 1
            start_idx += 1

        return room_count

The Meeting Rooms II problem focuses on finding the minimum number of conference rooms required based on a set of time intervals. The solution's strategy is to efficiently track room usage and determine overlaps using sorted lists of start and end times.

  • Initiate the process by checking if the list of intervals is empty. If it is, return 0 as no rooms are needed.
  • Proceed by extracting and sorting the start and end times from the list of given intervals.
  • Use two pointers, start_idx and end_idx, initialized to the beginning of their respective lists.
  • Iterate through the start_times list:
    • Compare the current start time with the current end time pointed by end_idx. If the start time is greater than or equal to the end time, it indicates that the earlier meeting is finished and a room is vacated, reducing the room count and moving the end_idx to the next end time.
    • For every iteration of the start time, regardless of overlap, increment the room count and the start_idx.
  • After processing all intervals, return the final room count as the minimum number of required rooms.

This method is both effective and efficient, leveraging the sorted time points and two pointers to dynamically adjust the count of occupied rooms.

Comments

No comments yet.