这道题是对我启蒙:设计针对自定义类的比较器Comparator,重载Comparator类中compare()方法的一道题,当时连续做了3道类似的interval的题,所以印象还比较深刻。。。有merge interval, count how many rooms need, and whether one room is enough。。这三道题本身都不难,只要将Interval这个类的设计好比较器,先进行一个排序,那么之后的操作就很简单了。。。
还有一点要注意的是,在排序完成后,要根据3道题不同意思,来用特定的结构存贮数据:是用List呢,还是PriorityQueue,还是只需要遍历一遍自身(List, Arrays),都要具体情况来定。。这道题是要返回需要的房间数,要根据
public class Solution {
public int minMeetingRooms(Interval[] intervals) {
Arrays.sort(intervals, new Comparator<Interval>() {
@Override
public int compare(Interval i1, Interval i2){
if(i1.start==i2.start) return i1.end-i2.end;
else return i1.start-i2.start;
}
});
// 这个写法有点屌,在input 参数域就定义好了comparator,因为只用到了一次。。。看这里,还有右括号和分号 ); 说了是sort();内部定义的
int rooms=0;
PriorityQueue<Integer> myQ= new PriorityQueue<Integer>();
//Queue<Integer> myQ= new LinkedList<Integer>(); // 通过实验室,用Queue和排序end配合,还是不能解决这个问题,可能因为当start不等时,end其实不能排序了。。。所以这里其实是通过sort对start排序,然后在利用PQ对end排序!!!总结起来说,什么时候需要room,那就是看start的排序来;什么时候可以空出room,那就是看谁最先结束,那就是end的排序来!! 卧槽,我太牛逼了。。。还是要分析才能出真知啊!!
for(int i=0; i<intervals.length; i++){
myQ.offer(intervals[i].end);
if(intervals[i].start<myQ.peek()) rooms++;
else myQ.poll();
}
return rooms;
}
}
// 初看这道题,试图用合并的那个思路来解决,只有要合并就+1,假象了一个例子就否定了这个思路。。。比如[1, 20] [10,40] [30,50] 实际只需要2 rooms,但是合并的思路会产生3 rooms
// 看了一下别人的解法,通过PriorityQueue来解答,很不错的样子。。。但是我思考了一下,为什么要用PQ而不是Q呢?难道是因为只排序了start,没有排序end么,我不妨试试。。。实验了,搞不定,解释见上方的Queue那句代码。。。