摘要
在这篇文章中,我们将深入探讨 LeetCode 第 253 题“会议室 II”。该问题要求计算安排一系列会议所需的最小会议室数量。我们将提供 Swift 的解法,包括可运行的示例代码,并结合实际场景进行分析,帮助大家更好地理解和应用这一算法。
描述
想象一下,你是一个会议管理员,需要安排多个会议。每个会议都有开始和结束时间,可能会有重叠。你的任务是计算出至少需要多少个会议室,才能确保所有会议都能顺利进行,且不会出现时间冲突。
示例 1:
输入:[[0, 30],[5, 10],[15, 20]]
输出:2
示例 2:
输入:[[7,10],[2,4]]
输出:1
题解答案
为了解决这个问题,我们可以采用以下步骤:
-
分解时间点:将所有会议的开始时间和结束时间分开,分别存入两个数组。
-
排序:对开始时间和结束时间数组进行排序。
-
双指针遍历:使用两个指针分别遍历开始时间和结束时间数组,计算同时进行的最大会议数量。
题解代码分析
以下是使用 Swift 实现的具体代码:
func minMeetingRooms(_ intervals: [[Int]]) -> Int {
guard !intervals.isEmpty else { return 0 }
var startTimes = intervals.map { $0[0] }.sorted()
var endTimes = intervals.map { $0[1] }.sorted()
var startPointer = 0
var endPointer = 0
var usedRooms = 0
while startPointer < intervals.count {
if startTimes[startPointer] >= endTimes[endPointer] {
usedRooms -= 1
endPointer += 1
}
usedRooms += 1
startPointer += 1
}
return usedRooms
}
代码解析:
-
初始化:首先,检查
intervals
是否为空,若为空则返回 0。然后,分别提取所有会议的开始时间和结束时间,并对它们进行排序。 -
双指针遍历:使用
startPointer
和endPointer
分别遍历开始时间和结束时间数组。每当一个会议开始时,增加usedRooms
计数;每当一个会议结束且有新的会议开始时,减少usedRooms
计数。 -
更新指针:根据会议的开始和结束时间,移动相应的指针,直到遍历完所有会议。
示例测试及结果
示例测试 1:
let meetings = [[0, 30], [5, 10], [15, 20]]
print(minMeetingRooms(meetings)) // 输出:2
示例测试 2:
let meetings = [[7, 10], [2, 4]]
print(minMeetingRooms(meetings)) // 输出:1
时间复杂度
-
排序时间:对开始时间和结束时间数组进行排序,时间复杂度为 O(N log N),其中 N 是会议的数量。
-
遍历时间:使用双指针遍历所有会议,时间复杂度为 O(N)。
因此,总的时间复杂度为 O(N log N)。
空间复杂度
- 存储时间数组:需要额外的空间来存储开始时间和结束时间数组,空间复杂度为 O(N)。
总结
通过上述方法,我们可以高效地计算出安排所有会议所需的最小会议室数量。该算法利用了排序和双指针技巧,确保了时间和空间的高效性。