1st round, 253 Meeting Rooms II

这道题是对我启蒙:设计针对自定义类的比较器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那句代码。。。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值