Array
Greedy
Heap (Priority Queue)
Prefix Sum
Sorting
Two Pointers
Description
Given an array of meeting time intervals intervals
where intervals[i] = [starti , endi ]
, return the minimum number of conference rooms required .
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
Solutions
Solution 1: Difference Array
We can implement this using a difference array.
First, we find the maximum end time of all the meetings, denoted as \(m\) . Then, we create a difference array \(d\) of length \(m + 1\) . For each meeting, we add to the corresponding positions in the difference array: \(d[l] = d[l] + 1\) for the start time, and \(d[r] = d[r] - 1\) for the end time.
Next, we calculate the prefix sum of the difference array and find the maximum value of the prefix sum, which represents the minimum number of meeting rooms required.
The time complexity is \(O(n + m)\) and the space complexity is \(O(m)\) , where \(n\) is the number of meetings and \(m\) is the maximum end time.
Python3 Java C++ Go TypeScript Rust
1
2
3
4
5
6
7
8
9
10
11
12 class Solution :
def minMeetingRooms ( self , intervals : List [ List [ int ]]) -> int :
m = max ( e [ 1 ] for e in intervals )
d = [ 0 ] * ( m + 1 )
for l , r in intervals :
d [ l ] += 1
d [ r ] -= 1
ans = s = 0
for v in d :
s += v
ans = max ( ans , s )
return ans
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 class Solution {
public int minMeetingRooms ( int [][] intervals ) {
int m = 0 ;
for ( var e : intervals ) {
m = Math . max ( m , e [ 1 ] );
}
int [] d = new int [ m + 1 ] ;
for ( var e : intervals ) {
++ d [ e [ 0 ]] ;
-- d [ e [ 1 ]] ;
}
int ans = 0 , s = 0 ;
for ( int v : d ) {
s += v ;
ans = Math . max ( ans , s );
}
return ans ;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 class Solution {
public :
int minMeetingRooms ( vector < vector < int >>& intervals ) {
int m = 0 ;
for ( const auto & e : intervals ) {
m = max ( m , e [ 1 ]);
}
vector < int > d ( m + 1 );
for ( const auto & e : intervals ) {
d [ e [ 0 ]] ++ ;
d [ e [ 1 ]] -- ;
}
int ans = 0 , s = 0 ;
for ( int v : d ) {
s += v ;
ans = max ( ans , s );
}
return ans ;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 func minMeetingRooms ( intervals [][] int ) ( ans int ) {
m := 0
for _ , e := range intervals {
m = max ( m , e [ 1 ])
}
d := make ([] int , m + 1 )
for _ , e := range intervals {
d [ e [ 0 ]] ++
d [ e [ 1 ]] --
}
s := 0
for _ , v := range d {
s += v
ans = max ( ans , s )
}
return
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14 function minMeetingRooms ( intervals : number [][]) : number {
const m = Math . max (... intervals . map (([ _ , r ]) => r ));
const d : number [] = Array ( m + 1 ). fill ( 0 );
for ( const [ l , r ] of intervals ) {
d [ l ] ++ ;
d [ r ] -- ;
}
let [ ans , s ] = [ 0 , 0 ];
for ( const v of d ) {
s += v ;
ans = Math . max ( ans , s );
}
return ans ;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 impl Solution {
pub fn min_meeting_rooms ( intervals : Vec < Vec < i32 >> ) -> i32 {
let mut m = 0 ;
for e in & intervals {
m = m . max ( e [ 1 ]);
}
let mut d = vec! [ 0 ; ( m + 1 ) as usize ];
for e in intervals {
d [ e [ 0 ] as usize ] += 1 ;
d [ e [ 1 ] as usize ] -= 1 ;
}
let mut ans = 0 ;
let mut s = 0 ;
for v in d {
s += v ;
ans = ans . max ( s );
}
ans
}
}
Solution 2: Difference (Hash Map)
If the meeting times span a large range, we can use a hash map instead of a difference array.
First, we create a hash map \(d\) , where we add to the corresponding positions for each meeting's start time and end time: \(d[l] = d[l] + 1\) for the start time, and \(d[r] = d[r] - 1\) for the end time.
Then, we sort the hash map by its keys, calculate the prefix sum of the hash map, and find the maximum value of the prefix sum, which represents the minimum number of meeting rooms required.
The time complexity is \(O(n \times \log n)\) and the space complexity is \(O(n)\) , where \(n\) is the number of meetings.
Python3 Java C++ Go TypeScript Rust
class Solution :
def minMeetingRooms ( self , intervals : List [ List [ int ]]) -> int :
d = defaultdict ( int )
for l , r in intervals :
d [ l ] += 1
d [ r ] -= 1
ans = s = 0
for _ , v in sorted ( d . items ()):
s += v
ans = max ( ans , s )
return ans
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 class Solution {
public int minMeetingRooms ( int [][] intervals ) {
Map < Integer , Integer > d = new TreeMap <> ();
for ( var e : intervals ) {
d . merge ( e [ 0 ] , 1 , Integer :: sum );
d . merge ( e [ 1 ] , - 1 , Integer :: sum );
}
int ans = 0 , s = 0 ;
for ( var e : d . values ()) {
s += e ;
ans = Math . max ( ans , s );
}
return ans ;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 class Solution {
public :
int minMeetingRooms ( vector < vector < int >>& intervals ) {
map < int , int > d ;
for ( const auto & e : intervals ) {
d [ e [ 0 ]] ++ ;
d [ e [ 1 ]] -- ;
}
int ans = 0 , s = 0 ;
for ( auto & [ _ , v ] : d ) {
s += v ;
ans = max ( ans , s );
}
return ans ;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 func minMeetingRooms ( intervals [][] int ) ( ans int ) {
d := make ( map [ int ] int )
for _ , e := range intervals {
d [ e [ 0 ]] ++
d [ e [ 1 ]] --
}
keys := make ([] int , 0 , len ( d ))
for k := range d {
keys = append ( keys , k )
}
sort . Ints ( keys )
s := 0
for _ , k := range keys {
s += d [ k ]
ans = max ( ans , s )
}
return
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 function minMeetingRooms ( intervals : number [][]) : number {
const d : { [ key : number ] : number } = {};
for ( const [ l , r ] of intervals ) {
d [ l ] = ( d [ l ] || 0 ) + 1 ;
d [ r ] = ( d [ r ] || 0 ) - 1 ;
}
let [ ans , s ] = [ 0 , 0 ];
const keys = Object . keys ( d )
. map ( Number )
. sort (( a , b ) => a - b );
for ( const k of keys ) {
s += d [ k ];
ans = Math . max ( ans , s );
}
return ans ;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 use std :: collections :: HashMap ;
impl Solution {
pub fn min_meeting_rooms ( intervals : Vec < Vec < i32 >> ) -> i32 {
let mut d : HashMap < i32 , i32 > = HashMap :: new ();
for interval in intervals {
let ( l , r ) = ( interval [ 0 ], interval [ 1 ]);
* d . entry ( l ). or_insert ( 0 ) += 1 ;
* d . entry ( r ). or_insert ( 0 ) -= 1 ;
}
let mut times : Vec < i32 > = d . keys (). cloned (). collect ();
times . sort ();
let mut ans = 0 ;
let mut s = 0 ;
for time in times {
s += d [ & time ];
ans = ans . max ( s );
}
ans
}
}