贪心算法--堆--安排会议室
一些项目要占用一个会议室宣讲, 会议室不能同时容纳两个项目的宣讲。
给你每一个项目开始的时间和结束的时间(给你一个数组, 里面是一个个具体的项目),
你来安排宣讲的日程, 要求会议室进行 的宣讲的场次最多。
返回这个最多的宣讲场次。
贪心:按照结束时间最早排序
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; } }