贪心之会议最大数目

package com.zhang.reflection.面试.算法模版.贪心算法;
import java.util.ArrayList;
import java.util.Collections;
import java.util.PriorityQueue;
/**牛客 NC392
 * 给定一个闭区间列表 meetings ,其中 meetings_i = [starts_i,end_i]
 * 结束,你可以在这个区间的任意一天中参加这个会议,但是你一天只能参加一个会议。
 * 请你算出你最多可以参加多少个会议。
 * [[5,9],[16,8],[6,40],[17,50],[13,19],[15,7],[21,32],[10,3],[1,2],[27,18]]
 * 6
 */
public class 参加会议最大数目 {
    public int attendmeetings (ArrayList<ArrayList<Integer>> meetings) {
        // write code here
        Collections.sort(meetings, (a, b) -> {
            return a.get(0) != b.get(0)?a.get(0)-b.get(0):a.get(1)-b.get(1);
        });
        PriorityQueue<Integer> queue = new PriorityQueue<>();
        int i = 0;
        int day = 1;
        int res = 0;
        while (i < meetings.size() || !queue.isEmpty()) {
            // 将day天能参加的会议全部加入到优先队列,按照结束时间排序
            while (i < meetings.size() && meetings.get(i).get(0) == day) {
                queue.add(meetings.get(i).get(1));
                i++;
            }
            // 将已经结束的会议全部删掉
            while (!queue.isEmpty() && queue.peek() < day) {
                queue.poll();
            }
            // 一天只能参加一场会议将结束时间最早的安排了
            if (!queue.isEmpty()) {
                queue.poll();
                res++;
            }
            // 安排下一天
            day++;
        }
        return res;
    }
}
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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