今天我们来看一下字节跳动的另一类高频提,叫做Meeting Room。先来看一下题
问题描述
给定一系列的会议时间间隔,包括起始和结束时间[[s1,e1],[s2,e2],…(si < ei),确定一个人是否可以参加所有会议。
例子
输入: intervals = [(0,30),(5,10),(15,20)]
输出: false
解释:
(0,30), (5,10) 和 (0,30),(15,20) 这两对会议会冲突
输入: intervals = [(5,8),(9,15)]
输出: true
解释:
这两个时间段不会冲突
解法:
一千个人心里有一千个哈姆雷特,那么一千个人就有一千种解法,我们拿到题之后,还是先看一下暴力解法。是不是你可以从intevals里面循环拿每一天去和后面的每一个来比较时间,看看会不会有冲突。但是很明显没有效率。其实这个例子是有迷惑性的,那就是因为这个题并没有说,时间是排好序的。既然这样,那我们来给它排个序,看看有没有什么帮助。好,现在假设已经排好序了,那后面怎么办呢。这是不是说明,后面的会议肯定是比前面的会议起始的要晚,那我们只要看看后面的会开始的时候,前面的会有没有结束就好了吧。那么转成代码就是这样的。
public boolean canAttendMeetings(List<Interval> intervals) {
// Write your code here
if(intervals == null || intervals.size() == 0) {
return true;
}
Collections.sort(intervals, new Comparator<Interval>(){
public int compare(Interval meeting1, Interval meeting2) {
return meeting1.start - meeting2.start;
}
});
int end = intervals.get(0).end;
for (int i = 1; i < intervals.size(); i++) {
if (end > intervals.get(i).start) {
return false;
}
end = intervals.get(i).end;
}
return true;
}
我们明天来看一下这道题的升级版,好,今天就到这里喽。