问题描述
小M的程序设计大作业是编写一个多任务下载器。在实现过程中,他遇到了一个问题:在一次下载过程中,总共有N个任务,每个任务会在第x秒开始,并持续y秒。小M需要知道,在同一时刻,最多有多少个任务正在同时下载,也就是计算出任务的最高并发数。
-
n表示任务的数量。 -
array是一个二维列表,每个元素为[x, y],表示任务的开始时间和持续时间,其中:x表示任务的开始时间;y表示任务的持续时间。
测试样例
样例1:
输入:
n = 2 ,array = [[1, 2], [2, 3]]输出:2
样例2:
输入:
n = 4 ,array = [[1, 2], [2, 3], [3, 5], [4, 3]]输出:3
样例3:
输入:
n = 5 ,array = [[1, 3], [3, 4], [2, 2], [6, 5], [5, 3]]输出:3
要求
- 编写一个函数
solution(n, array),输入任务数量n和任务列表array,输出在同一时刻最多有多少个任务正在同时下载。
思路
需要计算在同一时刻最多有多少个任务正在同时下载。每个任务有一个开始时间和持续时间,这意味着每个任务有一个开始时间和结束时间。我们需要找出在任意时刻,同时进行的任务数量的最大值。
数据结构选择
为了有效地计算并发任务数,我们可以使用以下数据结构和算法:
-
时间线扫描法:
- 将每个任务的开始和结束时间点记录下来。
- 对所有时间点进行排序。
- 遍历排序后的时间点,维护一个计数器来记录当前正在进行的任务数。
- 在每个时间点更新计数器,并记录最大值。
算法步骤
-
创建时间点列表:
- 对于每个任务
[x, y],创建两个时间点:一个表示任务开始(x, 'start'),一个表示任务结束(x + y, 'end')。
- 对于每个任务
-
排序时间点:
- 对时间点列表进行排序,首先按时间排序,如果时间相同,则先处理结束时间点再处理开始时间点(这样可以避免重复计数)。
-
遍历时间点:
- 初始化一个计数器
current_tasks为 0。 - 遍历排序后的时间点列表,遇到开始时间点时,
current_tasks加 1;遇到结束时间点时,current_tasks减 1。 - 在遍历过程中,记录
current_tasks的最大值。
- 初始化一个计数器
代码框架
根据上述思路,我们可以给出以下代码框架:
def solution(n, array):
# 创建时间点列表
events = []
for start, duration in array:
events.append((start, 'start'))
events.append((start + duration, 'end'))
# 对时间点列表进行排序
events.sort()
# 初始化计数器和最大并发数
current_tasks = 0
max_concurrent_tasks = 0
# 遍历时间点列表
for time, event_type in events:
if event_type == 'start':
current_tasks += 1
else:
current_tasks -= 1
# 更新最大并发数
max_concurrent_tasks = max(max_concurrent_tasks, current_tasks)
return max_concurrent_tasks
if __name__ == "__main__":
# Add your test cases here
print(
solution(2, [[1,2], [2,3]]) == 2
)
print(
solution(4, [[1,2], [2,3],[3,5], [4,3]]) == 3
)
关键步骤
- 创建时间点列表:将每个任务的开始和结束时间点记录下来。
- 排序时间点:对时间点列表进行排序,确保先处理结束时间点再处理开始时间点。
- 遍历时间点:通过遍历时间点列表,维护当前正在进行的任务数,并记录最大值。