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