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

猜你喜欢

转载自blog.csdn.net/qq_38702697/article/details/82956823