Treat each interval as two events: a start (+1 room) and an end (-1 room).
function minMeetingRooms(intervals)
events := []
for interval in intervals
events.add((interval.start, +1))
events.add((interval.end, -1))
sort events by time
// If same time, process ends before starts
rooms := 0
maxRooms := 0
for (time, delta) in events
rooms := rooms + delta
maxRooms := max(maxRooms, rooms)
return maxRooms
The maximum concurrent rooms at any time is the answer.
Time: for sorting. Space: for events.