Swift 解锁会议室最优调度法,LeetCode 253 不再难

在这里插入图片描述
在这里插入图片描述

文章目录

    • 摘要
    • 描述
    • 题解答案
    • 题解代码分析
    • 示例测试及结果
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

在这篇文章中,我们将深入探讨 LeetCode 第 253 题“会议室 II”。该问题要求计算安排一系列会议所需的最小会议室数量。我们将提供 Swift 的解法,包括可运行的示例代码,并结合实际场景进行分析,帮助大家更好地理解和应用这一算法。

描述

想象一下,你是一个会议管理员,需要安排多个会议。每个会议都有开始和结束时间,可能会有重叠。你的任务是计算出至少需要多少个会议室,才能确保所有会议都能顺利进行,且不会出现时间冲突。

示例 1:

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

示例 2:

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

题解答案

为了解决这个问题,我们可以采用以下步骤:

  1. 分解时间点:将所有会议的开始时间和结束时间分开,分别存入两个数组。

  2. 排序:对开始时间和结束时间数组进行排序。

  3. 双指针遍历:使用两个指针分别遍历开始时间和结束时间数组,计算同时进行的最大会议数量。

题解代码分析

以下是使用 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
}

代码解析:

  1. 初始化:首先,检查 intervals 是否为空,若为空则返回 0。然后,分别提取所有会议的开始时间和结束时间,并对它们进行排序。

  2. 双指针遍历:使用 startPointerendPointer 分别遍历开始时间和结束时间数组。每当一个会议开始时,增加 usedRooms 计数;每当一个会议结束且有新的会议开始时,减少 usedRooms 计数。

  3. 更新指针:根据会议的开始和结束时间,移动相应的指针,直到遍历完所有会议。

示例测试及结果

示例测试 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)。

总结

通过上述方法,我们可以高效地计算出安排所有会议所需的最小会议室数量。该算法利用了排序和双指针技巧,确保了时间和空间的高效性。

你可能感兴趣的:(Swift,swift,leetcode,开发语言)