这道题是求出需要的房子的最小个数。。。
思路还是比较清晰的:
1,start来决定房子的增加,start的先后顺序通过sort来解决。。
2,end来决定房子可以不增加的情况,end的先后顺序通过PQ来解决。。
每当有一堂课要加入时,只有上述两种情况,要么增加一个room,要么等最早结束的room空出来了可以加进去了。。。
代码如下,我一眼不看,自己实现一遍:
/**
* Definition for an interval.
* public class Interval {
* int start;
* int end;
* Interval() { start = 0; end = 0; }
* Interval(int s, int e) { start = s; end = e; }
* }
*/
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;
}
});
PriorityQueue<Integer> myQ= new PriorityQueue<Integer>();
int room=0;
for(Interval interval: intervals){
myQ.offer(interval.end);
if(interval.start<myQ.peek()) room++;
else myQ.poll();
}
return room;
}
}
哈哈,依靠我强大的思路,还是把这道题搞出来了。。。虽然最后两个条件写得没有特别精炼,但是已经很好了,完全没有问题。。
/**
* Definition for an interval.
* public class Interval {
* int start;
* int end;
* Interval() { start = 0; end = 0; }
* Interval(int s, int e) { start = s; end = e; }
* }
*/
public class Solution {
public int minMeetingRooms(Interval[] intervals) {
int len=intervals.length;
if(len==0) return 0;
Arrays.sort(intervals, new Comparator<Interval>(){
@Override
public int compare(Interval i1, Interval i2){
return i1.start-i2.start;
}
});
PriorityQueue<Integer> queue= new PriorityQueue<Integer>();
queue.add(intervals[0].end);
int room=1;
for(int i=1; i<len; i++){
if(intervals[i].start<queue.peek()){ // peek()用得不错啊,哈哈
room++;
queue.add(intervals[i].end); // add()和offer()通用,两个情况下都要add,这两个情况的区别是room要不要改变
}
else{
queue.add(intervals[i].end);
queue.poll();
}
}
return room;
}
}