题解 | #主持人调度(二)#

主持人调度(二)

https://www.nowcoder.com/practice/4edf6e6d01554870a12f218c94e8a299

package com.hhdd.贪心;

import java.util.*;

/**
 * 不会做
 *
 * @Author huanghedidi
 * @Date 2022/8/13 13:00
 */
public class 主持人调度2 {


    public static void main(String[] args) {
        int[][] startEnd = {{2147483646, 2147483647}, {2147483646, 2147483647}, {2147483646, 2147483647}, {2147483646, 2147483647}};
        int res = minmumNumberOfHost2(2, startEnd);
        System.out.println("res = " + res);
    }

    /**
     * 从最早开始到最晚开始遍历,找最大值
     * 确实想不到这种思路
     *
     * @param n
     * @param startEnd
     * @return
     */
    public static int minmumNumberOfHost(int n, int[][] startEnd) {
        // write code here
        int start1 = startEnd[0][0];
        int start2 = startEnd[0][0];
        for (int i = 1; i < startEnd.length; i++) {
            start1 = Math.min(startEnd[i][0], start1);
            start2 = Math.max(startEnd[i][0], start2);
        }
        int res = 0;
        for (int i = start1; i <= start2; i++) {
            int tmp = 0;
            for (int j = 0; j < startEnd.length; j++) {
                // 找出区间内的
                int[] item = startEnd[j];
                if (item[0] <= i && item[1] > i) {
                    tmp++;
                }
            }
            res = Math.max(res, tmp);
        }
        return res;
    }

    /**
     * 只会在边界的位置发生变化
     * 开始点增加 结束点减少
     * 最终结果取较大值
     * 需要额外的辅助空间
     *
     * @param n
     * @param startEnd
     * @return
     */
    public static int minmumNumberOfHost2(int n, int[][] startEnd) {
        // write code here
        // key 表示时点 value表示改时点需要几个主持人
        HashMap<Integer, Integer> help = new HashMap<>();

        for (int i = 0; i < startEnd.length; i++) {
            int[] item = startEnd[i];
            int start = item[0];
            int end = item[1];
            if (help.containsKey(start)) {
                help.put(start, help.get(start) + 1);
            } else {
                help.put(start, 1);
            }
            if (help.containsKey(end)) {
                help.put(end, help.get(end) - 1);
            } else {
                help.put(end, -1);
            }
        }
        Set<Integer> set = help.keySet();
        ArrayList<Integer> list = new ArrayList<>(set);
        Collections.sort(list);
        int res = 0;
        int sum = 0;
        for (Integer item : list) {
            sum += help.get(item);
            res = Math.max(res, sum);
        }
        return res;
    }

    /**
     * 使用优先队列解决(小根堆)
     * 优先队列的特点 有大小 且堆顶是最小值
     * 结合此题场景 什么时候需要新增主持人:前面所有的主持人都还在忙
     * 如果最早结束的主持人不在忙了,说明不需要新增主持人
     *
     * @param n
     * @param startEnd
     * @return
     */
    public static int minmumNumberOfHost3(int n, int[][] startEnd) {
        Arrays.sort(startEnd, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                if (o1[0] == o2[0]) {
                    return o1[1] - o2[1];
                } else {
                    return o1[1] - o2[1];
                }
            }
        });
        PriorityQueue<Integer> help = new PriorityQueue<>();
        for (int i = 0; i < startEnd.length; i++) {
            int[] item = startEnd[i];
            if (!help.isEmpty() && help.peek() <= item[0]) {
                help.poll();
            }
            help.offer(item[1]);
        }
        return help.size();
    }

}


全部评论

相关推荐

牛客101244697号:这个衣服和发型不去投偶像练习生?
点赞 评论 收藏
分享
面试摇了我吧:啊哈哈面试提前五个小时发,点击不能参加就是放弃
点赞 评论 收藏
分享
在努力的外卷侠很靠谱:怎么,大家都没保底吗?我这美团已经入职了,不说了,系统派单了。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务