一、问题描述
小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
| key | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|
| i=0 | +1 | +1 | |||||
| i=1 | +1 | +1 | +1 | ||||
| i=2 | +1 | +1 | +1 | +1 | +1 | ||
| i=3 | +1 | +1 | +1 | ||||
| value | 1 | 2 | 2 | 3 | 2 | 2 | 1 |
七、函数的使用
- 哈希表的创建
- 哈希表的添加
- 哈希表获取key对应的value值
- 哈希表获取value数组
- for each用法