📜  铁路汽车站所需的最低月台数量 | Set 2(基于集合的方法)(1)

📅  最后修改于: 2023-12-03 15:12:32.127000             🧑  作者: Mango

铁路汽车站所需的最低月台数量 | Set 2(基于集合的方法)

在铁路汽车站的运营中,每个月台都可以停靠一辆火车或汽车,为了保证客流量的需求,需要确定最低的月台数量,以提供足够的停车位。

题目描述

给定一组火车/汽车进站和离站的时间,实现一个算法来计算所需的最低月台数量。

算法分析

这个问题可以使用一个集合来解决,具体步骤如下:

  1. 将所有进站时间按照时间从小到大的顺序排序;
  2. 遍历每个进站时间,如果当前有月台可用,将进站时间所对应的车辆停在该月台,更新月台使用情况;
  3. 如果当前没有可用的月台,新开一个月台,并将进站时间所对应的车辆停在该月台,更新月台使用情况;
  4. 遍历每个离站时间,将对应车辆所在的月台标记为空闲月台,更新月台使用情况;
  5. 返回使用月台的最大值,即为所需的最低月台数量。
代码实现
def platform_count(train_schedule):
    """
    :param train_schedule: 火车/汽车进站和离站的时间列表
    :return: 所需的最低月台数量
    """
    train_schedule.sort()  # 按时间顺序排序
    platforms_in_use = set()  # 用于存储当前正在使用的月台
    max_platforms_in_use = 0  # 用于记录使用月台的最大值

    for event in train_schedule:
        if event.startswith('arrive'):
            # 到达事件,寻找可用月台
            for platform in platforms_in_use.copy():
                if event[7:] >= platform:
                    platforms_in_use.remove(platform)
                    break
            platforms_in_use.add(event[7:])
            max_platforms_in_use = max(max_platforms_in_use, len(platforms_in_use))
        else:
            # 离开事件,标记对应月台为空闲状态
            platforms_in_use.remove(event[5:])

    return max_platforms_in_use
测试样例
test_schedule = [
    'arrive at 09:00', 'arrive at 09:40', 'arrive at 10:00',
    'arrive at 10:10', 'arrive at 10:30', 'depart at 11:00',
    'depart at 11:20', 'depart at 11:30', 'depart at 12:00',
]
print(platform_count(test_schedule))  # 输出 3
性能分析

该算法的时间复杂度为 O(nlogn),其中 n 为进出站的车辆数量,主要是排序操作的时间复杂度为 O(nlogn)。空间复杂度为 O(n),即为记录当前正在使用的月台的集合空间大小。

总结

该算法使用了集合来维护当前正在使用的月台,从而避免了使用数组/矩阵等需要预先分配空间的数据结构,提高了空间利用效率。同时,该算法在时间复杂度的基础上,做到了代码简洁易懂,易于理解。