方法一:贪心思想->排序+遍历比较

利用贪心的思想,当上个活动和下个活动之间没有时间交集则不需要新增主持人,因此,要对有交集的主持人做判断,需增加多少主持人。

步骤:

1、将所有活动的开始时间和结束时间取出并分别排序。

2、遍历,比较本次活动的开始时间和上个活动的结束时间的大小,若本次活动开始时间晚则可以延用上个活动的主持人,无需新增主持人活动结束的数组下标后移一个,相反则需要新增主持人。

3、最后返回主持人个数即可。

import java.util.*;
public class Solution {
    /**
     * 计算成功举办活动需要多少名主持人
     * @param n int整型 有n个活动
     * @param startEnd int整型二维数组 startEnd[i][0]用于表示第i个活动的开始时间,startEnd[i][1]表示第i个活动的结束时间
     */
    public int minmumNumberOfHost (int n, int[][] startEnd) {
        int[] start = new int [n];
        int[] end = new int [n];
        for(int i=0;i<n;++i){
            start[i] = startEnd[i][0];
            end[i] = startEnd[i][1];
        }
        Arrays.sort(start,0,start.length);
        Arrays.sort(end,0,end.length);
        int res=0;  // 主持人个数
        int j=0;  //上一活动的结束时间的下标
        for(int i=0;i<n;++i){ //i为本次活动的开始时间的下标
            if(start[i]>=end[j]){ //当前活动的开始时间比上一活动的结束时间晚,则可以由上个主持人继续主持
                j++;
            }else{ //当前活动开始的比上个活动结束的早,就需要多一个主持人
                res++;
            }
        }
        return res;
    }
}

方法二:重载排序+小顶堆(优先队列)

将活动按照活动开始时间排序,因此需要重新写Arrays.sort的内部排序函数,然后创建小顶堆,存储结束时间,每遍历一个活动就判断当前的活动开始时间和堆顶的大小,若堆顶即最近的活动结束时间更早,则等这个活动结束就可以开始当前的活动,不需要添加新的主持人,所以堆顶出队,然后不论谁时间更早都将当前活动的结束时间添加到堆中。遍历完所有活动,最终留下的堆结点个数就是主持人个数。

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) {
        int[] A = new int [n];
        int k =0;
        //重写排序函数,根据活动开始时间递增排序
        Arrays.sort(startEnd, new Comparator<Object>(){
            public int compare(Object o1,Object o2){
                int[] one = (int[])o1;
                int[] two = (int[])o2;
                if(one[0]>two[0]) return 1;
                else if(one[0]==two[0]) return 0;
                else return -1;
            }
        });
        //构造小顶堆
        PriorityQueue<Integer> q= new PriorityQueue<Integer>();
        //先添加一个最小的值作为堆顶,因为有可能给的区间为负值
        q.offer(Integer.MIN_VALUE);
        for(int i=0;i<n;++i){
            if(q.peek()<=startEnd[i][0]){
                q.poll();  // 最近活动的结束时间早于当前活动的开始时间,去掉堆顶,不需要新的主持人
            }
            //添加新的堆结点为当前活动的结束时间
            q.offer(startEnd[i][1]);
        }
        return q.size();
    }
}