Lintcode:919. 會議室 II
阿新 • • 發佈:2018-11-04
給定一系列的會議時間間隔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:如果給出的物件或者描述是,含有開始和結束標誌的話,並且他們的開始和結束之間有時間、資源的相互的約束,可以考慮分別對開始、結束進行排序,從而進行處理