Meeting Rooms Problem Minimum Rooms Required in DSA Typescript - Time & Space Complexity
We want to find out how the time needed to find the minimum number of meeting rooms grows as the number of meetings increases.
Specifically, how does the algorithm handle more meetings and overlapping times?
Analyze the time complexity of the following code snippet.
function minMeetingRooms(intervals: number[][]): number {
intervals.sort((a, b) => a[0] - b[0]);
const heap: number[] = [];
for (const interval of intervals) {
if (heap.length && heap[0] <= interval[0]) {
heap.shift();
}
heap.push(interval[1]);
heap.sort((a, b) => a - b);
}
return heap.length;
}
This code finds the minimum number of rooms needed to hold all meetings without overlap by sorting and managing end times.
- Primary operation: Looping through all meetings once.
- How many times: Once for each meeting (n times).
- Inside loop operations: Sorting the heap array after each insertion.
- Dominant operation: Sorting the heap inside the loop, which happens n times.
As the number of meetings grows, the sorting inside the loop takes more time because the heap grows.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 times sorting small arrays (up to 10 elements) |
| 100 | About 100 times sorting arrays up to 100 elements |
| 1000 | About 1000 times sorting arrays up to 1000 elements |
Pattern observation: Sorting inside the loop causes the total work to grow roughly with the square of the input size.
Time Complexity: O(n² log n)
This means the time needed grows roughly proportional to the square of the number of meetings times a small log factor, which can be slow for large inputs.
[X] Wrong: "Sorting the meetings once means the whole algorithm is just O(n log n)."
[OK] Correct: Because sorting the heap inside the loop happens n times, this adds up to much more work than just one sort.
Understanding how repeated sorting inside loops affects time helps you explain and improve solutions clearly, a skill valued in interviews and real projects.
What if we used a priority queue (min-heap) data structure instead of sorting the heap array each time? How would the time complexity change?
Practice
Solution
Step 1: Understand the problem goal
The problem asks for the minimum number of rooms needed so that no meetings overlap in the same room.Step 2: Clarify what is NOT asked
It is not about meeting durations, counts, or earliest times, but about room allocation to avoid conflicts.Final Answer:
The minimum number of meeting rooms needed to hold all meetings without overlap -> Option BQuick Check:
Minimum rooms = no overlapping meetings [OK]
- Confusing total meetings with rooms needed
- Thinking about meeting length instead of overlaps
- Ignoring overlapping intervals
Solution
Step 1: Identify sorting by start time
We want to sort intervals by their start time, which is the first element in each interval array.Step 2: Check the sorting function
The correct comparator subtracts start times: a[0] - b[0]. This sorts ascending by start time.Final Answer:
intervals.sort((a, b) => a[0] - b[0]); -> Option DQuick Check:
Sort by start time = a[0] - b[0] [OK]
- Sorting by end time instead of start time
- Using addition instead of subtraction in comparator
- Mixing start and end indices in comparator
const intervals = [[0, 30], [5, 10], [15, 20]];
function minMeetingRooms(intervals: number[][]): number {
intervals.sort((a, b) => a[0] - b[0]);
const heap: number[] = [];
for (const interval of intervals) {
if (heap.length && heap[0] <= interval[0]) {
heap.shift();
}
heap.push(interval[1]);
heap.sort((a, b) => a - b);
}
return heap.length;
}
console.log(minMeetingRooms(intervals));Solution
Step 1: Sort intervals by start time
Sorted intervals: [[0,30], [5,10], [15,20]] (already sorted)Step 2: Simulate heap to track end times
First interval: heap = [30] Second interval starts at 5, heap[0]=30 > 5, so no removal, heap = [30,10], sorted to [10,30] Third interval starts at 15, heap[0]=10 <= 15, remove 10, heap = [30], then add 20, heap = [20,30]Final Answer:
2 -> Option AQuick Check:
Max overlapping meetings = 2 rooms needed [OK]
- Not sorting intervals before processing
- Not removing ended meetings from heap
- Assuming heap length equals total meetings
function minMeetingRooms(intervals: number[][]): number {
intervals.sort((a, b) => a[1] - b[1]);
const heap: number[] = [];
for (const interval of intervals) {
if (heap.length && heap[0] <= interval[0]) {
heap.shift();
}
heap.push(interval[1]);
heap.sort((a, b) => a - b);
}
return heap.length;
}Solution
Step 1: Check sorting criteria
The intervals are sorted by end time (a[1] - b[1]) but should be sorted by start time to process meetings in order.Step 2: Understand impact of wrong sorting
Sorting by end time breaks the logic of checking overlaps because meetings are not processed in chronological start order.Final Answer:
Intervals are sorted by end time instead of start time -> Option AQuick Check:
Sort by start time, not end time [OK]
- Sorting by end time instead of start time
- Not sorting heap after insertion
- Incorrect condition to remove ended meetings
Solution
Step 1: Sort intervals by start time
Sorted intervals: [[1,4], [2,5], [3,6], [7,9], [10,11]]Step 2: Track overlapping meetings
At time 1: room count = 1 At time 2: overlaps with [1,4], rooms = 2 At time 3: overlaps with [1,4] and [2,5], rooms = 3 At time 7: previous meetings ended, rooms = 1 At time 10: rooms = 1Final Answer:
3 -> Option CQuick Check:
Max overlaps = 3 rooms needed [OK]
- Not sorting intervals before counting overlaps
- Underestimating overlaps by ignoring simultaneous meetings
- Assuming one room fits all meetings
Ready to prove it?
Pass the test and this pattern moves unknown
