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