Meeting Rooms

Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] (si < ei), determine if a person could attend all meetings.

思路
这道题就是要找区间之间是否有overlap。对一个区间来说被别的区间overlap有三种情况:

  • 完全覆盖:比如[5, 6]和[3, 7],区间[5, 6]完全被[3, 7]覆盖

  • 前一部分被覆盖:比如[5, 7]和[3, 6],区间[5, 7]的前面一部分被[3, 6]覆盖

  • 后一部分被覆盖:比如[5, 8]和[7, 9]

不管是哪种,都满足条件intervals[i].end > intervals[j].start

Sort
直接两两比较时间复杂度是O(N^2)。为了降低复杂度,可以先sort一下intervals,根据start来sort,这样j就变成i+1,比较的复杂度变成O(N)。而sort的复杂度是O(NlogN),所以最后总的复杂度为O(NlogN)。java8里面sort可以用lambada表达式写。

    public boolean canAttendMeetings(Interval[] intervals) {
        // base case
        if(intervals == null || intervals.length == 0) return true;
        
        // sort
        Arrays.sort(intervals, (a, b) -> a.start == b.start ? a.end - b.end : a.start - b.start);
        
        for(int i = 0; i < intervals.length - 1; i++) {
            if(intervals[i].end > intervals[i+1].start) return false;
        }
        return true;
    }

Meeting Rooms II

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.

思路
overlap的条件依然是:intervals[i].end > intervals[j].start
不同的是这题需要求房间数。还是先sort,i指向之前有overlap的最小end的那一个。

复杂度
Time Complexity: O(NlogN),Space: O(N)。

heap
因为要知道之前有overlap的最小的end,所以可以用一个min heap。每次检查新的start是否比heap的top元素小,是的话就把保存原来的end,同时放进新的end;否则就放新的end同时poll出原来的,因为没有overlap且新的end较大。最后heap的大小就是需要的房间数。比如:
[1, 5], [2, 4], [3, 6], [5, 7]

  1. heap: [5]。[2, 4]的start是2,比5小,所以放入4。

  2. heap: [4, 5]。接着[3 ,6]的start是3,比4小,所以又放入6。

  3. heap: [4, 5, 6]。[5, 7]的start是5,比4大,因此poll出4,放入7。

  4. heap: [5, 6, 7]。最后heap的size为3。

4被pop出来是因为[2, 4]和[5, 7]公用一个房间,只要放7进去就可以了。

    public int minMeetingRooms(Interval[] intervals) {
        // base case
        if(intervals == null || intervals.length == 0) return 0;
        // sort
        Arrays.sort(intervals, (a, b) -> a.start == b.start ? a.end - b.end : a.start - b.start);
        // min heap to store the end
        PriorityQueue<Integer> minHeap = new PriorityQueue<>();
        minHeap.offer(intervals[0].end);
        for(int i = 1; i < intervals.length; i++) {
            // no overlap
            if(minHeap.peek() <= intervals[i].start) minHeap.poll();
            minHeap.offer(intervals[i].end);
        }
        
        return minHeap.size();
    }

lulouch13
13 声望6 粉丝