253. Meeting Rooms II

็…งๅŽŸๆœฌ 252, 56 ็š„ๆ€่ทฏไพ†ๅš็š„่ฉฑ....ๅช้‡ๅฐ start ๆŽ’ๅบ, ็š„็ขบๆ˜ฏ็ฌฆๅˆ้€™ๅ€‹case

ไฝ†ไธ็ฌฆๅˆ ex2, ้€™ๆจฃ่ท‘, count ๆœƒๆ˜ฏ 0, ๆ‡‰่ฉฒ้ ๆƒณ, ๅ…ˆไฝ”ไธ€ๅ€‹ room , ไฝ†้€™ๆจฃ ex1 ๆœƒ้Œฏ

ๅ–ฎๅ–ฎ้‡ๅฐ start ๆŽ’ๅบๆ˜ฏไธๅค ็š„, ไปฅไธ‹ๆ˜ฏ้Œฏ็š„

class Solution {
    public int minMeetingRooms(int[][] intervals) {
        // so should sort first
        // e > s  room++ else s = news, e = newe
        // [[0,               30],
        //     [5,10],
        //            [15,20]]
        
        // [2,4] [7,10]
        if (intervals == null || intervals[0].length == 0) return 0;
        Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
        
        int count = 0;
        int start = intervals[0][0];
        int end = intervals[0][1];
        
        for (int i = 1; i < intervals.length; i++) {
            int interval[] = intervals[i];
            if (end > interval[0]) {
                count++;
            } else {
                start = interval[0];
                end = interval[1];
            }
        }
        return count;
    }
}

use line sweep

1.separately sort start, sort end

ๆ‡‰่ฉฒๆ˜ฏ่ฆๆ”นๆˆ้€™ๆจฃๆƒณ

start

| | | |

end

| | | |

start ่ตฐๅˆฐ index 0, 1 ๆ™‚, ้ƒฝๅฐๆ–ผ min end

before min end, there are two starts, means 2 rooms are required, count = 2

when start ๅˆฐ index 2 ๆ™‚, ๅทฒ็ถ“ๆฏ” min end ๅคง, ไปฃ่กจๆœ‰ไธ€ๅ€‹ๆˆฟ้–“็ตๆŸไบ†, ๆ‰€ไปฅไธ้œ€่ฆๆ›ดๅคš room,

็ถญๆŒ count = 2, so min end index++

O(logn), O(n)

class Solution {
    public int minMeetingRooms(int[][] intervals) {
        if (intervals == null || intervals.length == 0) return 0;
        int start[] = new int[intervals.length];
        int end[] = new int[intervals.length];
        for (int i = 0; i < intervals.length; i++) {
            start[i] = intervals[i][0];
            end[i] = intervals[i][1];
        }
        Arrays.sort(start);
        Arrays.sort(end);
        
        int endIdx = 0;
        int count = 1;
        for (int i = 1; i < intervals.length; i++) {
            if (start[i] < end[endIdx]) { // no equal, beacuae when [1,13] [13,15], dont need count
                count++;
            } else {
                endIdx++;
            }
        }
        return count;
    }
}

2. use treeMap

้€™ๆ‡‰่ฉฒๆ˜ฏๆœ€ๅฅฝๅฏซ็š„ line sweep, ๅˆๅฏฆ็”จ

ex2:
Input: intervals = [[0,30],[5,10],[15,20]]
Output: 2

0+                   30-
     5+. 10-
             15+. 20-
1.   2.  1   2.   1   0      max room count = 2


1 1   -1  1 -1. -1
s s    e. s e.  e
0 5.  10 15 20 30
1 2.  1.  2  1. 0  max room count = 2

time: O(nlogn)

space: O(n)

class Solution {
    public int minMeetingRooms(int[][] intervals) {
        TreeMap<Integer, Integer> map = new TreeMap<>();
        int res = 0;
        for (int[] interval : intervals) {
            int start = interval[0];
            int end = interval[1];
            map.put(start, map.getOrDefault(start, 0) + 1);
            map.put(end, map.getOrDefault(end, 0) - 1);
        }
        
        int count = 0;
        // calculate by key order (tree map), order by time 
        for (int key : map.keySet()) { 
            count += map.get(key);
            res = Math.max(res, count);
        }
        return res;
    }
}

use minHeap

1. sort start time first
2. 
if there is a currStart >= minEnd, means you dont need new room, 
you can reuse the old room,
how to main a minEnd, use minHeap
  
0 1       1
0 1       2
------------- -2, max(current count, max count)
0.  2     3 
  1 2     3   cur count = 2, max count = 3
  1.  4       3    cur count = 3, max count = 3
     3.  6       3  cur count = 3-1+1 = 3, max count = 3 (currStart >= minEnd, 3 >= 2)
     cs 
  
  minEnd = 2, 
  currStart = 1   (1,2), currStart >= minEnd
  
use min heap

01           add, 12 do poll
01. max = 2, add, 14 do poll
0 2.     = 3 add, 36 do poll
 12       3  currStart >= minEnd
 1. 4.    3  currStart >= minEnd
   3. 6.  3  currStart >= minEnd

time : O(nlogn)

space: O(h), heap size, <= n

class Solution {
    public int minMeetingRooms(int[][] intervals) {
        Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
        PriorityQueue<int[]> minHeap = new PriorityQueue<>((a, b) -> a[1] - b[1]);
        minHeap.offer(intervals[0]);
        
        int count = 1;
        for (int i = 1; i < intervals.length; i++) {
            if (!minHeap.isEmpty() && intervals[i][0] >= minHeap.peek()[1]) {
                minHeap.poll();
            }
            minHeap.offer(intervals[i]);
            count = Math.max(count, minHeap.size());
        }
        return count;
    }
}

Last updated