返回最多会议室宣讲场次

95 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

题目

给定一个二维数组,每一个数组里面有两个元素,第一个元素表示会议开始的时间,第二个元素表示会议结束的时候。

思路

我们安排时间会有这么一些的想法

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

这个比较器就是表示元素的结束时间越早的越排在前面的意思。

总结

贪心算法就是思想的一个碰撞。如果遇到过就能很快的解决,如果没有遇到过想到还是很难的,对于这种题目还是要多刷。