【美团2023暑期实习第一场笔试第三题流星雨Java版本】

题目描述:

小美是位天文爱好者, 她收集了接下来段时间中所有 会划过她所在的观测地上空的流星信息。具体地,她收集了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);
    }
}


猜你喜欢

转载自blog.csdn.net/nowaywusuowei/article/details/129475640