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)。

总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

网罗开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值