贪心算法--堆--安排会议室

一些项目要占用一个会议室宣讲, 会议室不能同时容纳两个项目的宣讲。

给你每一个项目开始的时间和结束的时间(给你一个数组, 里面是一个个具体的项目),

你来安排宣讲的日程, 要求会议室进行 的宣讲的场次最多。

返回这个最多的宣讲场次。

贪心:按照结束时间最早排序

public class BestArrange {
    //将会议的开始时间和结束时间
    public static class Meeting{
        private int startTime;
        private int endTime;

        public Meeting(int startTime, int endTime){
            this.startTime = startTime;
            this.endTime = endTime;
        }
    }

    //小根堆的比较器
    public static class MinheapComparator implements Comparator<Meeting>{
        @Override
        public int compare(Meeting o1, Meeting o2) {
            return o1.endTime - o2.endTime;
        }
    }

    /**
     * 可以利用按照结束时间排序的小根堆来完成,会议开始时间小于当前会议结束时间的都要忽略掉
     * @param start
     * @param end
     * @param initStart
     * @return
     */
    public static int bestArrangeByHeap(int[] start, int[] end, int initStart){
        if(start.length == 0 || end.length == 0 || (start.length != end.length)) return 0;
        int res = 0;
        //利用优先队列和小根堆比较器构建小根堆
        //按照结束时间进行排序
        PriorityQueue<Meeting> meetings = new PriorityQueue<>(new MinheapComparator());

        for(int i = 0; i < start.length; i++){
            meetings.add(new Meeting(start[i], end[i]));
        }

        while(meetings.size() > 0){
            Meeting meeting = meetings.poll();
            //如果小根堆中会议的开始时间大于当前会议的开始时间,
            // 那么这些会议可以选入
            //同时当前时间修改为选入会议的结束时间
            if(meeting.startTime >= initStart){
                res++;
                initStart = meeting.endTime;
            }
        }
        return res;
    }

    /**
     * 还可以利用按照结束时间排序的数组来完成,
     * 利用Arrays工具类的sort,其中传入比较器即可
     * 会议开始时间小于当前会议结束时间的都要忽略掉
     * @param start
     * @param end
     * @param initStart
     * @return
     */
    public static int bestArrangeByArray(int[] start, int[] end, int initStart){
        if(start.length == 0 || end.length == 0 || (start.length != end.length)) return 0;
        int res = 0;

        Meeting[] meetings = new Meeting[start.length];

        for(int i = 0; i < start.length; i++){
            meetings[i] = new Meeting(start[i], end[i]);
        }

        //利用结束时间从小到大排序
        Arrays.sort(meetings, new MinheapComparator());

        for(int i = 0; i < meetings.length; i++){
            if(meetings[i].startTime >= initStart){
                res++;
                initStart = meetings[i].endTime;
            }
        }
        return res;
    }
}

  

原文地址:https://www.cnblogs.com/SkyeAngel/p/8964036.html