本文已参与「新人创作礼」活动,一起开启掘金创作之路
题目
给定一个二维数组,每一个数组里面有两个元素,第一个元素表示会议开始的时间,第二个元素表示会议结束的时候。
思路
我们安排时间会有这么一些的想法
1.按照时间的长短来
反例:【【1,15】,【16,29】,【12,17】】
2.按照开始时间早的来
反例:【【1,15】,【2,7】,【8,9】】
3.按照结束时间早的来。
上面两个我都有反例来说明想法的错误,第三个就是我们要说的答案。
那我们知道这个想法之后我们怎么实现?
代码
类代码
public static class Program {
public int start;
public int end;
public Program(int start, int end) {
this.start = start;
this.end = end;
}
}
我们让数组里面的两个元素用Program这个类来保存
实现代码
public static int bestArrange(Program[] programs){
if(programs == null || programs.length < 1){
return 0;
}
Arrays.sort(programs , new Com());
int end = programs[0].end;
int ans = 1;
int start = 0;
for(int i = 1;i<programs.length;i++){
start = programs[i].start;
if(end <= start){
ans++;
end = programs[i].end;
}
}
return ans;
}
我们就是先让数组根据结束的时间来排序,结束的越早,排的就越前面,之后我们要用一个变量来保存第一个元素的结束时间,这个就是用来之后比较的,如果后面的开始时间比自己结束时间早的话就不用,因为一个会议室只能有一个宣讲场次。如果一个元素的开始时间大于等于end的时候就表示这个是可以宣讲的,那我们的end就要保存这个元素的结束时间。一次往复就可以解决问题了。
比较器代码
public static class Com implements Comparator<Program>{
@Override
public int compare(Program o1, Program o2) {
return o1.end - o2.end;
}
}
这个比较器就是表示元素的结束时间越早的越排在前面的意思。
总结
贪心算法就是思想的一个碰撞。如果遇到过就能很快的解决,如果没有遇到过想到还是很难的,对于这种题目还是要多刷。