Lintcode:919. 会议室 II

给定一系列的会议时间间隔intervals,包括起始和结束时间[[s1,e1],[s2,e2],...] (si < ei),找到所需的最小的会议室数量。

public int minMeetingRooms(List<Interval> intervals) {

    //List<Interval> list = List.of(new Interval(0,30),new Interval(5,10), new Interval(15,20));
    List<Interval> list = List.of(new Interval(5, 8), new Interval(6, 8));
    intervals = new ArrayList<>(list);

    Collections.sort(intervals, new Comparator<Interval>() {
        @Override
        public int compare(Interval o1, Interval o2) {
            return (o1.start == o2.start) ? (o1.end - o2.end) : (o1.start - o2.start);
        }
    });

    List<Integer> rooms = new ArrayList<>();
    rooms.add(-1);
    for (Interval interval : intervals) {
        boolean isSet = false;
        for (int i = 0; i < rooms.size(); i++) {
            if (interval.start > rooms.get(i)) {
                rooms.set(i, interval.end);
                isSet = true;
                break;
            }
        }

        if (!isSet) rooms.add(interval.end);
    }

    //System.out.println(rooms.size());
    //System.out.println(rooms+1);
    return rooms.size();
}

//只要有一个会议的start 小于 另一个会议的 end, 说明这个会议就需要重新开一间房间
//对start/ends 的排序有着另一番意味
public int minMeetingRooms2(List<Interval> intervals) {
    List<Interval> list = List.of(new Interval(0, 30), new Interval(5, 10), new Interval(15, 20));
    //List<Interval> list = List.of(new Interval(5,8), new Interval(6,8));
    intervals = new ArrayList<>(list);

    int[] starts = new int[intervals.size()];
    int[] ends = new int[intervals.size()];
    for (int i = 0; i < intervals.size(); i++) {
        starts[i] = intervals.get(i).start;
        ends[i] = intervals.get(i).end;
    }
    Arrays.sort(starts);
    Arrays.sort(ends);
    int rooms = 0;
    int endsItr = 0;
    for (int i = 0; i < starts.length; i++) {
        if (starts[i] < ends[endsItr]) rooms++;
        else endsItr++;
    }
    return rooms;
}

自己的解法有点暴力解的感觉,不够技巧优雅,dalao采取的贪心策略是,先对会议的start,end进行排序,只要有一个会议的start小于另一个会议的end,说明这个会议就需要重新开一间房间

 

summary:如果给出的对象或者描述是,含有开始和结束标志的话,并且他们的开始和结束之间有时间、资源的相互的约束,可以考虑分别对开始、结束进行排序,从而进行处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值