学习笔记:计算任务的最高并发数 | 豆包MarsCode AI刷题

36 阅读2分钟

一、题目解析

在这个问题中,我们需要计算在多任务下载器中,同一时刻最多有多少个任务正在同时下载。给定 ( N ) 个任务,每个任务有开始时间和持续时间,我们需要找出任务的最高并发数。

二、代码详解

提供的代码通过模拟任务的开始和结束时间点来解决这个问题。代码的核心思想是:

  1. 创建一个事件列表,记录每个任务的开始时间和结束时间,用 1 表示开始,-1 表示结束。
  2. 对事件列表进行排序,确保时间点按顺序处理,如果时间相同,则先处理结束时间。
  3. 遍历事件列表,使用一个变量 currentConcurrency 来跟踪当前并发的任务数,每遇到一个开始时间点,currentConcurrency 加 1,每遇到一个结束时间点,currentConcurrency 减 1。
  4. 使用另一个变量 maxConcurrency 来记录遍历过程中遇到的最大并发数。
public static int solution(int n, int[][] array) {
    List<int[]> events = new ArrayList<>();
    for (int[] task : array) {
        events.add(new int[]{task[0], 1}); // 开始时间
        events.add(new int[]{task[0] + task[1], -1}); // 结束时间
    }
    
    events.sort((a, b) -> {
        if (a[0] == b[0]) {
            return a[1] - b[1];
        }
        return a[0] - b[0];
    });

    int maxConcurrency = 0;
    int currentConcurrency = 0;

    for (int[] event : events) {
        if (event[1] == 1) {
            currentConcurrency++;
        } else {
            currentConcurrency--;
        }
        maxConcurrency = Math.max(maxConcurrency, currentConcurrency);
    }

    return maxConcurrency;
}

三、知识总结

在解决这个问题的过程中,我学习到了如何使用事件驱动的方法来模拟并发任务。这种方法通过将任务的开始和结束时间点抽象为事件,然后对这些事件进行排序和处理,可以有效地计算出任务的最高并发数。这种方法在处理并发问题时非常有用,特别是在涉及到时间线和事件顺序的场景中。

四、学习计划

为了更深入地理解和掌握并发编程和事件驱动编程,我计划通过豆包MarsCode AI刷题功能,每天至少解决一个相关的问题,并总结每个问题的解题思路和关键点。此外,我还会阅读相关的书籍和教程,比如《Java并发编程实战》、《你不知道的JavaScript》等,来加深对并发编程的理解。

五、工具运用

在学习过程中,我会将豆包MarsCode AI刷题功能与其他在线资源相结合,比如LeetCode、GeeksforGeeks等,以获得更全面的练习。同时,我也会利用GitHub上的开源项目和教程,来实践并发编程的技巧,并学习如何优化代码以提高性能。

通过这样的学习方法,我相信我可以更系统地掌握并发编程的知识,为将来的学习和工作打下坚实的基础。