Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...]
(si < ei), find the minimum number of conference rooms required.
Example 1:
Input: [[0, 30],[5, 10],[15, 20]]
Output: 2
Example 2:
Input: [[7,10],[2,4]] Output: 1
M1:排序
把interval的start和end取出来,并分别对start时间排序,end时间排序。设置res, end两个变量,对intervals进行遍历,如果starts[i] < ends[end],说明需要新房间,res++;否则,说明一个会议已经结束,可以安排在当前房间,不需要新房间,end++。(start, end都是有时间顺序的,所以一个end之前必然存在一个对应的start)
Time Complexity: O(N) Space Complexity: O(N)
class Solution { public int minMeetingRooms(Interval[] intervals) { int[] starts = new int[intervals.length]; int[] ends = new int[intervals.length]; for(int i = 0; i < intervals.length; i++) { starts[i] = intervals[i].start; ends[i] = intervals[i].end; } Arrays.sort(starts); Arrays.sort(ends); int res = 0, end = 0; for(int i = 0; i < intervals.length; i++) { if(starts[i] < ends[end]) res++; else end++; } return res; } }
M2:用min heap
首先对intervals排序,按开始时间。用min heap记录merged intervals最小的结束时间。将intervals[0]加入heap。从intervals[1]开始,通过heap.poll()取到最早结束的会议,如果当前会议的开始时间大于(晚于)最早结束的会议的结束时间,说明可以继续用这个房间,不需要新的房间,因此合并两个interval(interval.end = intervals[i].end),反之则需要新的房间,在heap中加入当前interval,最后要记得把之前通过poll取出来比较的元素加回去。heap的大小就是最终结果。
时间 O(NlogN) 空间 O(1)
class Solution { public int minMeetingRooms(Interval[] intervals) { if (intervals == null || intervals.length == 0) return 0; Arrays.sort(intervals, (a, b) -> a.start - b.start); PriorityQueue<Interval> heap = new PriorityQueue<Interval>(intervals.length, (a, b) -> a.end - b.end); heap.offer(intervals[0]); for (int i = 1; i < intervals.length; i++) { Interval interval = heap.poll(); if (intervals[i].start >= interval.end) interval.end = intervals[i].end; else heap.offer(intervals[i]); heap.offer(interval); } return heap.size(); } }