1. 程式人生 > >leetcode253 - Meeting Rooms II - medium

leetcode253 - Meeting Rooms II - medium

eap 會議室 就是 imu mat for 最小 con star

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

最小堆。O(nLogn), O(n)
預處理:先把interval按照interval的start從小到大排好序。開一個最小堆,使得堆頂是end最小的interval。
遍歷intervals,把當前interval的start和堆頂的end對比,如果交叉,說明不能用最早結束的會議室從而要重開一個新房間,入當前,heap.size()多了1說明多一個會議室;如果不交叉,說明可以之前那個房間開會的人走了我可以直接用那個房間了,出堆頂入當前,heap.size()不變說明不用多會議室。
返回的答案也就是這個過程中heap.size()的巔峰值,打擂臺得到。

實現

/**
 * Definition for an interval.
 * public class Interval {
 *     int start;
 *     int end;
 *     Interval() { start = 0; end = 0; }
 *     Interval(int s, int e) { start = s; end = e; }
 * }
 */
class Solution {
    public int minMeetingRooms(Interval[] intervals) {
        if (intervals == null
|| intervals.length == 0) { return 0; } Arrays.sort(intervals, new Comparator<Interval>() { @Override public int compare(Interval a, Interval b) { return a.start - b.start; } }); PriorityQueue
<Interval> minHeap = new PriorityQueue<>(new Comparator<Interval>() { @Override public int compare(Interval a, Interval b) { return a.end - b.end; } }); int ans = 1; minHeap.offer(intervals[0]); for (int i = 1; i < intervals.length; i++) { int earliestEnd = minHeap.peek().end; if (intervals[i].start >= earliestEnd) { minHeap.poll(); minHeap.offer(intervals[i]); } else { minHeap.offer(intervals[i]); } ans = Math.max(ans, minHeap.size()); } return ans; } }

leetcode253 - Meeting Rooms II - medium