1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 贪心算法会场安排c语言 贪心算法--堆--安排会议室

贪心算法会场安排c语言 贪心算法--堆--安排会议室

时间:2021-09-15 12:51:38

相关推荐

贪心算法会场安排c语言 贪心算法--堆--安排会议室

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

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

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

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

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

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{

@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 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;

}

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。