NC147:主持人调度

主持人调度

http://www.nowcoder.com/questionTerminal/4edf6e6d01554870a12f218c94e8a299

解法1:优先级队列

首先:要对活动进行排序:

  • 开始时间相等的,结束时间从小到大
  • 开始时间不相等的,开始时间从小到大

其次:建立一个优先级队列:默认升序,同时处理活动

  • 只提供结束时间,如果当前的开始时间小于队首的结束时间,说明没空闲
  • 如果当前的开始时间大于队首的结束时间,说明可以空闲一个,队首出队

最后返回队列长度

import java.util.*;
public class Solution {
    public int minmumNumberOfHost (int n, int[][] startEnd) {
        // 排序,头相等的,尾从小到大
        // 头不相等的头从小到大
        Arrays.sort(startEnd,new Comparator<int[]>(){
           public int compare(int[] arr1,int[] arr2){
               if(arr1[0] == arr2[0]){
                   return arr1[1] - arr2[1];
               }
               return arr1[0] - arr2[0];
           } 
        });
        // 默认升序
        int min=Integer.MIN_VALUE;
        PriorityQueue<Integer> queue = new PriorityQueue<Integer>();
        queue.offer(min);
        for(int i = 0;i < n;i++){
            // 只提供结束时间,如果当前的开始时间小于队首的结束时间,说明没空闲
            // 如果当前的开始时间大于队首的结束时间,说明可以空闲一个,队首出队
            if(queue.peek() <= startEnd[i][0]) {
                queue.poll();
            }
            queue.offer(startEnd[i][1]);
        }
        return queue.size();
    }
}

解法2:循环遍历

对活动开始时间进行排序
对活动结束时间进行排序
starts[start] >= ends[end]时end++;
否则count++即需要增加一个主持人

import java.util.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算成功举办活动需要多少名主持人
     * @param n int整型 有n个活动
     * @param startEnd int整型二维数组 startEnd[i][0]用于表示第i个活动的开始时间,startEnd[i][1]表示第i个活动的结束时间
     * @return int整型
     */
    public int minmumNumberOfHost (int n, int[][] startEnd) {
        // write code here
        int[] starts = new int[startEnd.length];
        int[] ends = new int[startEnd.length];
        for(int i = 0 ;i < startEnd.length;i++){
            starts[i] = startEnd[i][0];
            ends[i] = startEnd[i][1];
        }
        Arrays.sort(starts);
        Arrays.sort(ends);

        int count = 0;
        int end = 0;
        for(int start = 0;start< startEnd.length;start++){
            if(starts[start] >= ends[end]){
                end++;
            }else{
                count++;
            }
        }
        return count;

    }
}
名企高频面试算法题解 文章被收录于专栏

牛客题霸 - 程序员面试高频题 - 题解

全部评论
优先级队列那个有点问题 问题再sort排序那里,return arr1[1] - arr2[1] 这里不能这么写 比如当arr1[1] = MAX_VALUE arr2[1] = MIN_VALUE时会越界导致排序出现异常,可以改一下 return arr1[1] > arr2[1] ? 1 : -1 下面的也是一样
7 回复 分享
发布于 2021-08-10 11:16
解决1是有问题的,你在重写compare方法时,里面使用了 return arr1[0] - arr2[0]这个是有问题,当arr1[0]为int的最大或最小值时,你这个减法后,值是超出了int的大小,最后排序是不对的.所以此处不应该计算.使用 arr1[0] >= arr2[0] ? 1 : -1;代替才是对的
1 回复 分享
发布于 2021-12-05 22:01
如果出现3,[[1,2],[1,2],[1,2]], 即存在多场一样的活动,输出的结果是不是有问题呢
点赞 回复 分享
发布于 2021-08-25 15:14
解决1中的队列出队没有判空操作,会导致空指针异常
点赞 回复 分享
发布于 2022-03-29 11:07

相关推荐

11-14 16:13
已编辑
重庆科技大学 测试工程师
Amazarashi66:不进帖子我都知道🐮❤️网什么含金量
点赞 评论 收藏
分享
11-04 14:10
东南大学 Java
_可乐多加冰_:去市公司包卖卡的
点赞 评论 收藏
分享
评论
13
2
分享
牛客网
牛客企业服务