刷题第二天-LintCode919&920.会议室

前言:这种题目放在两年前我可以很快的写出来,现在看着它一脸懵逼,连easy的都写不出来,我佛啦,六个月速度刷题!!!

知识点:贪心(把大问题分成小问题)


题目920(easy):给数个会议的占用时间,问你这几个会议有没有冲突的。题目链接

思路:按会议开始时间从小到大排序,判断后面会议开始的时间是不是比前一个会议结束的时间提前,如果是说明gg了。

/**
 * Definition of Interval:
 * public classs Interval {
 *     int start, end;
 *     Interval(int start, int end) {
 *         this.start = start;
 *         this.end = end;
 *     }
 * }
 */

public class Solution {
    /**
     * @param intervals: an array of meeting time intervals
     * @return: if a person could attend all meetings
     */
    public boolean canAttendMeetings(List<Interval> intervals) {
        // Write your code here
        //sort the start,from low to high
        Collections.sort(intervals,new Comparator<Interval>(){
            public int compare(Interval i1, Interval i2)
            {
                return i1.start - i2.start;
            }
        });

        int preEnd = 0;
        for(Interval curr:intervals)
        {
            if(curr.start<preEnd)
                return false;
            preEnd = curr.end;
        }

        return true;
    }
}



难点:重写sort(是我太生疏了)


题目919(medium):给你数个会议起始、终止时间,问你需要几个会议室安排他们?(是920的进阶了)题目链接

思路:按会议开始时间从小到大排序,创建一个List<Integer>代表房间号,里面存储的是此间会议室结束使用的时间。

          针对每个会议,从第一间会议室开始遍历,判断此会议室满不满足,不满足则增加新的会议室。最后size()就是需要的房间数。

/**
 * Definition of Interval:
 * public classs Interval {
 *     int start, end;
 *     Interval(int start, int end) {
 *         this.start = start;
 *         this.end = end;
 *     }
 * }
 */

public class Solution {
    /**
     * @param intervals: an array of meeting time intervals
     * @return: the minimum number of conference rooms required
     */
    public int minMeetingRooms(List<Interval> intervals) {
        // Write your code here
         Collections.sort(intervals,new Comparator<Interval>(){
            public int compare(Interval i1, Interval i2)
            {
                return i1.start - i2.start;//返回>0则进行排序,否则不变
            }
        });
        
        List<Integer> rooms = new ArrayList<Integer>();
        rooms.add(-1);
        boolean flag = false;
        
        for(Interval ival:intervals)
        {
            for(int i=0;i<rooms.size();i++)
            {
                if(ival.start>rooms.get(i))
                {
                    rooms.set(i,ival.end);
                    flag = true;
                    break;
                }
            }

            if(!flag)
            {
                rooms.add(ival.end);
            }
            flag = false;
        }

        return rooms.size();
    }
}

到此为止,明天继续冲贪心。btw,刷题好累。我的发际线可能又要上移动了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值