题目

给定一个会议时间安排的数组,每个会议时间都会包括开始和结束的时间 [[s1,e1],[s2,e2],...] (si < ei),为避免会议冲突,同时要考虑充分利用会议室资源,请你计算至少需要多少间会议室,才能满足这些会议安排。

示例 1:
输入: [[0, 30], [5, 10], [15, 20]]
输出: 2

示例 2:
输入: [[7, 10], [2, 4]]
输出: 1

方案一

  1. class Solution:
  2. def minMeetingRooms(self, intervals: List[List[int]]) -> int:
  3. # 1. 将 intervals 按照地一个值进行排序
  4. # 2. 每个会议室维护一个最晚结束的时间点
  5. # 3. 遍历 intervals,根据能否在该会议室安排确定是否要更新最晚结束时间
  6. intervals.sort()
  7. rooms = [] # 每个 room 的最晚结束时间
  8. for interval in intervals:
  9. start, end = interval
  10. for i, room in enumerate(rooms):
  11. if room <= start: # 可以继续安排新的会议
  12. rooms[i] = end
  13. break
  14. else: # 没有找到合适的会议室
  15. rooms.append(end)
  16. return len(rooms)
  • 时间复杂度 253. 会议室 II - 图1

    方案二(最小堆)

    ```python import heapq

class Solution: def minMeetingRooms(self, intervals: [[int]]) -> int: rooms = [0] # rooms 堆,一开始有一个会议室 intervals.sort() for interval in intervals: start, end = interval

  1. min_endtime = rooms[0] # 所有会议室的最小结束时间
  2. if min_endtime <= start: # 可以安排新的会议
  3. heapq.heapreplace(rooms, end)
  4. else:
  5. heapq.heappush(rooms, end)
  6. return len(rooms) if rooms[0] != 0 else 0

- 使用最小堆来减少方案一寻找 room 的时间复杂度
<a name="WRcfc"></a>
# 方案三(堆)
```go
func minMeetingRooms(intervals [][]int) int {
    h := &Heap{}
    for _, interval := range intervals {
        heap.Push(h, interval)
    }

    // rooms 维护每个会议室会议结束的时间
    rooms := []int{0}
    outer:
    for h.Len() > 0 {
        interval := heap.Pop(h).([]int)
        for i, eTime := range rooms {
            // 开始时间比较晚,不需要新的会议室了
            if interval[0] >= eTime {
                rooms[i] = interval[1]
                continue outer
            }
        }

        rooms = append(rooms, interval[1])
    }

    return len(rooms)
}

type Heap [][]int

func (h Heap) Len() int           { return len(h) }
func (h Heap) Less(i, j int) bool { return h[i][0] < h[j][0] }
func (h Heap) Swap(i, j int)      { h[i], h[j] = h[j], h[i] }

func (h *Heap) Push(x interface{}) {
    *h = append(*h, x.([]int))
}

func (h *Heap) Pop() interface{} {
    old := *h
    n := len(old)
    x := old[n-1]
    *h = old[0 : n-1]
    return x
}

参考地址

https://leetcode-cn.com/explore/featured/card/2020-top-interview-questions/283/heap-stack/1267/
https://leetcode-cn.com/problems/meeting-rooms-ii/solution/hui-yi-shi-ii-by-leetcode/
https://leetcode-cn.com/problems/meeting-rooms-ii/