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

135 阅读2分钟

一、问题描述

小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


三、思路

用哈希表保存时间对应的任务数量,从任务的开始时间一直到任务结束,经过的时间的value值都加一,最后再找出同时进行的最多的任务数。


四、代码

public static int solution(int n, int[][] array) {
    HashMap<Integer,Integer> time=new HashMap<>();
    for(int i=0;i<n;i++){
        for(int j=0;j<array[i][1];j++){
            time.put(array[i][0]+j, time.getOrDefault(array[i][0]+j, 0)+1);
        }
    } 
    int num=0;
    for(int cnt:time.values()){
        num=Math.max(cnt,num);
    }
    return num;
}

五、代码详解

for(int i=0;i<n;i++){
    for(int j=0;j<array[i][1];j++){
        time.put(array[i][0]+j, time.getOrDefault(array[i][0]+j, 0)+1);
    }
}

第一个for循环是每一项任务。

第二个for循环从任务开始时间array[i][0]持续了任务持续时间array[i][1],即j从0开始,把当前任务时间array[i][0]+j对应的value值加一。

用getOrDefault()获取原本的value值,在此基础上加1。

int num=0;
for(int cnt:time.values()){
    num=Math.max(cnt,num);
}

用for each遍历哈希表的value数组,用Math.max找到同时进行的最多的任务数。


六、图解

样例:

输入:n=4,array=[[1, 2], [2, 3], [3, 5], [4, 3]]

输出:3

1. i=0

  • 开始时间:1
  • 持续时间:2
  • j=0~1
  • 给1~2的值+1

2. i=1

  • 开始时间:2
  • 持续时间:3
  • j=0~2
  • 给2~4的值+1

3. i=2

  • 开始时间:3
  • 持续时间:5
  • j=0~4
  • 给3~7的值+1

4. i=3

  • 开始时间:4
  • 持续时间:3
  • j=0~2
  • 给4~6的值+1
key1234567
i=0+1+1
i=1+1+1+1
i=2+1+1+1+1+1
i=3+1+1+1
value1223221

七、函数的使用

  • 哈希表的创建
  • 哈希表的添加
  • 哈希表获取key对应的value值
  • 哈希表获取value数组
  • for each用法