题目描述:
小美是位天文爱好者, 她收集了接下来段时间中所有 会划过她所在的观测地上空的流星信息。具体地,她收集了n个流星在她所在观测地上空的出现时刻和消失时刻。对于一个流星,若’其的出现时刻为s,消失时刻为t,那么小美在时间段[s, t]都能够观测到它。对于一个时刻,观测地上空出现的流星数量越多,则小美认为该时刻越好。小美希望能够选择一个最佳的时刻进行观测和摄影,使她能观测到最多数量的流星。现在小美想知道 ,在这个最佳时刻,她最多能观测到多少个流星以及一共有多少个最佳时刻可供她选择。
输入描述
第一行是一个正整数n,表示流星的数量。
第二行是n个用空格隔开的正整数,第i个数si表示第i个流星的出现时间。
第三行是n个用空格隔开的正整数,第i个数ti表示第i个流星的消失时间。
1<=n<=100000, 1<=si<=ti<=10^9
输出描述
输出一行用空格隔开的两个数x和y,其中x表示小美能观测到的最多流星数,y表示可供她选择的最佳时刻数量。
算法思路:
思路同leetcode2251. 花期内花的数目(差分+离散化)
import java.util.*;
public class Main {
//3
//1 2 5
//3 6 7
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] start = new int[n];
int[] end = new int[n];
for (int i = 0; i < n; i++) {
start[i] = in.nextInt();
}
for (int i = 0; i < n; i++) {
end[i] = in.nextInt();
}
System.out.println(Integer.MAX_VALUE);
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < n; i++) {
map.put(start[i], map.getOrDefault(start[i], 0) + 1);
map.put(end[i] + 1, map.getOrDefault(end[i] + 1, 0) - 1);
}
// 这里times就对应一个记录差分的数组,times[i]是记录的时间点,map对应的是时间点的变化
// 之后针对离散化的段区间点,找哪个点为最大值,最大值到下一个点之间即为最大值区间
int[] times = map.keySet().stream().sorted().mapToInt(a -> a).toArray();
int[] count = new int[times.length];
int max = 0;
count[0] = map.get(times[0]);
for (int i = 1; i < times.length; i++) {
count[i] = count[i - 1] + map.get(times[i]);
max = Math.max(max, count[i]);
}
int res = 0;
for (int i = 0; i < times.length; i++) {
if (count[i] == max) {
if (i < times.length - 1 ) res += times[i + 1] - times[i];
else res++;
}
}
System.out.println(max + " " + res);
}
}