题解 | 主持人调度(二)

主持人调度(二)

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

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) {
        Arrays.sort(startEnd, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                if (o1[0] > o2[0]) {
                    return 1;
                } else if (o1[0] == o2[0]) {
                    if (o1[1] > o2[1]) {
                        return 1;
                    } else {
                        return -1;
                    }
                } else {
                    return -1;
                }
            }
        });
        PriorityQueue<Integer> pq = new PriorityQueue<>();
        for (int i = 0; i < n; i++) {
            int[] ints = startEnd[i];
            if (pq.isEmpty()) {
                pq.add(ints[1]);
            } else {
                Integer peek = pq.peek();
                //如果开始时间小于结束时间
                if (ints[0] < peek) {
                    pq.add(ints[1]);
                } else {
                    pq.poll();
                    pq.add(ints[1]);
                }
            }
        }
        return pq.size();
    }
}

第一步根据开始时间(第一优先级)和结束时间(第二优先级,开始时间相同的结束时间早的排前面)排序。

这里采用小顶堆(最小的会出现在最上面)来做。

以{{1,2},{2,3}}为例

先把第一个的结束时间放入堆里,此时堆顶是2.

此时遇到了第二个数据{2,3}.

堆顶是2,结束时间也是2,所以还可以用这个主持人

把这个堆顶元素弹出,修改成结束时间后加入回去,此时堆顶元素变成3.

遍历结束,此时堆里只有一个元素,返回1.

再以{{1,3},{2,4}}为例

第一次把3压入。

遇到了第二{2,4}的时候,堆顶的元素是3

2<3,所以活动还没有结束,需要新开一个,把结束时间4压入。

此时堆里有2个元素了,返回2

如果此时再来一个{3,5}.

此时堆顶元素是3,

3=3,所以,不需要新开一个,直接把3弹出,把结束时间5压入。

此时堆里还是2个值。

全部评论

相关推荐

肥肠椒绿:双非本可不就犯天条了,双非本就应该打入无间地狱
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务