253. 会议室 II¶
题目¶
给定一系列的会议时间间隔 intervals
,包括起始和结束时间 [[s1,e1],[s2,e2],...] (si < ei)
,找到所需的最小的会议室数量。
示例 1:
输入:
intervals = [(0,30),(5,10),(15,20)]
输出:
2
解释: 需要两个会议室,会议室 1:
(0,30)
,会议室 2:(5,10),(15,20)
题解¶
思路 1: 数组排序¶
用两个数组来做,分别保存起始时间和结束时间,然后各自排个序。
然后开始遍历,如果当前起始时间小于结束时间,则结果自增 1,反之结束时间指针自增 1,这样可以找出重叠的时间段,从而安排新的会议室
- 时间复杂度:\(O(nlogn)\)
- 空间复杂度:\(O(n)\)
Go
func minMeetingRooms(intervals [][]int) int {
var startTimes []int
var endTimes []int
for _, interval := range intervals {
startTimes = append(startTimes, interval[0])
endTimes = append(endTimes, interval[1])
}
sort.Ints(startTimes)
sort.Ints(endTimes)
endIdx := 0
roomsCount := 0
for i := 0; i < len(intervals); i++ {
earliestEndTime := endTimes[endIdx]
if startTimes[i] < earliestEndTime {
roomsCount++
} else {
endIdx++
}
}
return roomsCount
}
Python
class Solution:
def minMeetingRooms(self, intervals: List[List[int]]) -> int:
if len(intervals) == 0:
return 0
startTimes = sorted([interval[0] for interval in intervals])
endTimes = sorted([interval[1] for interval in intervals])
endIndex = 0
roomsCount = 0
for i in range(len(intervals)):
# 新会议的开启时间 早于 上一个会议的结束时间, 此时需要一个新的会议室
if startTimes[i] < endTimes[endIndex]:
roomsCount += 1
else:
endIndex += 1
return roomsCount
思路 2: 扫描线¶
TODO