任务并发数问题 - 字节笔试题
小M的程序设计大赛大作业是编写一个多任务的下载器,在做到计算任务并发数的时候遇到了困难。
在一次下载中,总共包含N个任务,每一个任务会在第x秒开始,并持续y秒。小M想知道,在一次下载中,同时最多会有多少个任务正在下载。
输入描述:
第一行输入一个正整数N,代表共有N个任务
之后共有N行,每行包含两个正整数x,y,其中,x代表任务开始的时间,y代表的是任务需要持续的时间
输出描述:
输出包含一个正整数,代表最高的任务并发数
示例1:
输入:
4
1 2
2 3
3 5
4 3
输出:
3
说明:
4个任务的时间区间分别为[1,2],[2,4],[3,7],[4,6]
故在第4秒的时候,第2,3,4号任务正在进行
思路分析:
我们定义一个结果集变量,初始化为0,用它来记录最大的并发数,然后我们定义一个Map,记录每一个时间段任务的并发数
package com.feng.test;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
/**
* Created by FengBin on 2021/9/14 14:29
*/
public class Solution {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = Integer.parseInt(in.nextLine());
int[][] tasks = new int[n][2];
for (int i = 0; i < n; i++) {
String[] s = in.nextLine().split(" ");
tasks[i][0] = Integer.parseInt(s[0]);
tasks[i][1] = Integer.parseInt(s[1]);
}
int res = findMaxCurrentNumber(tasks);
System.out.println(res);
}
//求解最大并发数的方法
private static int findMaxCurrentNumber(int[][] tasks) {
int n = tasks.length;
//key为任务的时间,value为该时间段任务的并发量
Map<Integer,Integer> map = new HashMap<>();
int res = 0;
for (int i = 0; i < n; i++) {
int x = tasks[i][0];
int y = tasks[i][1];
for (int k = x; k < x + y; k++) {
map.put(k,map.getOrDefault(k,0) + 1);
res = Math.max(res,map.get(k));
}
}
return res;
}
}