会议室 II

Submission

运行时间: 27 ms

内存: 18.5 MB

class Solution:
    def minMeetingRooms(self, intervals: List[List[int]]) -> int:
        intervals.sort()
        pq = []
        ans = 0
        for a in intervals:
            while pq and pq[0] <= a[0]:
                heapq.heappop(pq)
            
            heapq.heappush(pq, a[1])
            ans = max(ans, len(pq))
        return ans

Explain

这个题解是使用优先队列(小根堆)来解决会议室安排问题。首先对会议时间区间按开始时间排序。然后遍历每个会议,对于当前遍历到的会议,如果优先队列不为空且队首元素小于等于当前会议的开始时间,说明队首的会议已经结束,可以弹出队首。接着将当前会议的结束时间加入优先队列。同时维护一个变量 ans 记录优先队列的最大长度,即需要的最多会议室数量。最后返回 ans 即可。

时间复杂度: O(nlogn)

空间复杂度: O(n)

class Solution:
    def minMeetingRooms(self, intervals: List[List[int]]) -> int:
        intervals.sort()  # 按会议开始时间排序
        pq = []  # 存储会议结束时间的最小堆
        ans = 0  # 记录所需的最多会议室数
        for a in intervals:
            while pq and pq[0] <= a[0]:  # 当最小堆非空且堆顶元素小于等于当前会议开始时间
                heapq.heappop(pq)  # 弹出堆顶元素,即最早结束的会议
            
            heapq.heappush(pq, a[1])  # 将当前会议的结束时间加入最小堆
            ans = max(ans, len(pq))  # 更新所需的最多会议室数
        return ans

Explore

这行代码是关键部分,它确保了能够正确地计算出在任何时刻所需的最大会议室数量。优先队列(小根堆)`pq`用于存储各个会议的结束时间。每次将一个会议的结束时间加入到堆中,堆的大小(即`len(pq)`)就代表了此时正在进行中的会议数量。因此,每次在添加一个新的会议结束时间后,堆的大小就是当前需要的会议室数量。`ans = max(ans, len(pq))`这行代码在每次会议加入后执行,用来更新所需会议室的最大数量。如果当前的堆大小(正在进行的会议数量)比之前记录的`ans`大,那么更新`ans`为当前的堆大小。这样一来,遍历所有会议后,`ans`中存储的就是在任何时刻所需的最大会议室数量。