小M的多任务下载器挑战思路及题解 | 豆包MarsCode AI刷题

95 阅读3分钟

问题描述

小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,输出在同一时刻最多有多少个任务正在同时下载。

思路

需要计算在同一时刻最多有多少个任务正在同时下载。每个任务有一个开始时间和持续时间,这意味着每个任务有一个开始时间和结束时间。我们需要找出在任意时刻,同时进行的任务数量的最大值。

数据结构选择

为了有效地计算并发任务数,我们可以使用以下数据结构和算法:

  1. 时间线扫描法

    • 将每个任务的开始和结束时间点记录下来。
    • 对所有时间点进行排序。
    • 遍历排序后的时间点,维护一个计数器来记录当前正在进行的任务数。
    • 在每个时间点更新计数器,并记录最大值。

算法步骤

  1. 创建时间点列表

    • 对于每个任务 [x, y],创建两个时间点:一个表示任务开始 (x, 'start'),一个表示任务结束 (x + y, 'end')
  2. 排序时间点

    • 对时间点列表进行排序,首先按时间排序,如果时间相同,则先处理结束时间点再处理开始时间点(这样可以避免重复计数)。
  3. 遍历时间点

    • 初始化一个计数器 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
    )

关键步骤

  • 创建时间点列表:将每个任务的开始和结束时间点记录下来。
  • 排序时间点:对时间点列表进行排序,确保先处理结束时间点再处理开始时间点。
  • 遍历时间点:通过遍历时间点列表,维护当前正在进行的任务数,并记录最大值。