252, 253. Meeting Rooms I II的几种写法

先说253, 252在下面。
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.

这题就比较经典。
有几种做法,最套路的是扫描线,用heap也能做。

线段的题,给的线段刚开始往往都是没有排序的,这些长短不一又没有排序的线段很难直接入手。我们往往向按其中一端排个序,这样至少多了一点确定性。
所以解法 1
先按起始点排序
然后扫描每一个点。在每个点把它的end时间扔到heap里面,然后看一下我的起始时间是不是比heap的最小值要大,如果大就一直poll heap直到小于 当前的start time。然后heap size就是当前需要的最大数目。扫描整个数组得到全局最大值。

class Solution {
    public int minMeetingRooms(Interval[] intervals) {
        Arrays.sort(intervals, new Comparator(){
            public int compare(Interval o1, Interval o2) {
                return o1.start - o2.start;
            }
        });
        Queue queue = new PriorityQueue<>();
        int largest = 0;
        for (Interval itv : intervals) {
            while (!queue.isEmpty() && queue.peek() <= itv.start) {
                queue.poll();
            }
            queue.offer(itv.end);
            largest = Math.max(largest, queue.size());
        }
        return largest;
    }
}

解法2
sweep line的解法。
把事件散化, start time相当于开了一个session, end time关闭session.
从左往右一起扫,看最多有几个session开着。
也可以把start time和end time分别放在不同的数组里一起扫,谁小移谁。

class Solution {
    public int minMeetingRooms(Interval[] intervals) {
        int[] start = new int[intervals.length];
        int[] end = new int[intervals.length];
        for (int i = 0; i < intervals.length; i++) {
            start[i] = intervals[i].start;
            end[i] = intervals[i].end;
        }
        Arrays.sort(start);
        Arrays.sort(end);
        int maxCount = 0;
        int bookings = 0;
        int pt1 = 0, pt2 = 0;
        while (pt1 < intervals.length) {
            int s = start[pt1];
            int e = end[pt2];
            if (e <= s) {
                bookings--;
                pt2++;
            } else {
                pt1++;
                bookings++;
                maxCount = Math.max(bookings, maxCount);
            }
        }
        return maxCount;
    }
}

顺便帖一下252的写法

class Solution {
    public boolean canAttendMeetings(Interval[] intervals) {
        Arrays.sort(intervals, new Comparator(){
            public int compare(Interval itv1, Interval itv2) {
                return itv1.start - itv2.start;
            }
        });
        for (int i = 1; i < intervals.length; i++) {
            if (intervals[i].start < intervals[i - 1].end) return false;
        }
        return true;
    }
}

你可能感兴趣的:(252, 253. Meeting Rooms I II的几种写法)