253. Meeting Rooms II


June-18-2019

变体,条件和上一题一样,但是让算最多同时有多少会议进行。
按startTime sort array
PQ based on endTime to track on-going meetings.
遍历array,每有一个meeting,看下再这个会开始前有多少个在进行的会结束了,看PQ里的endTime。
维持PQ的最大SIZE就是答案。

    public int minMeetingRooms(int[][] intervals) {
        if (intervals.length <= 1) return intervals.length;
        Arrays.sort(intervals, new Comparator<int[]>() {
            public int compare(int[] A, int[] B) {
                return Integer.compare(A[0], B[0]);
            }
        });
        
        PriorityQueue<Integer> endTimePQ = new PriorityQueue<>();
        int res = -1;
        for (int[] interval : intervals) {
            int startTime = interval[0];
            while (!endTimePQ.isEmpty() && endTimePQ.peek() <= startTime) {
                endTimePQ.poll();
            }
            endTimePQ.offer(interval[1]);
            res = Math.max(res, endTimePQ.size());
        }
        return res;
    }

还有一种楞做法
所有timeStamp排列,负的代表结束,看看同时进行的最大是多少
唯一需要注意的就是时间相等的情况下,如果一个是开始,一个是结束,要把开始放在前面先算。

    public int minMeetingRooms(int[][] intervals) {
        if (intervals.length <= 1) return intervals.length;
        
        Integer[] timeStamp = new Integer[intervals.length * 2];
        for (int i = 0; i < intervals.length; i++) {
            timeStamp[i * 2] = intervals[i][0];
            timeStamp[i * 2 + 1] = -intervals[i][1];
        }
        
        Arrays.sort(timeStamp, new Comparator<Integer>() {
            public int compare(Integer i1, Integer i2) {
                
                if (Math.abs(i1) == Math.abs(i2)) {
                    if (i1 < 0) {
                        return -1;
                    } else {
                        return 1;
                    }
                }
                
                return Integer.compare(Math.abs(i1), Math.abs(i2));
            }
        });
        
        int tempMeetingCount = 0;
        int res = 0;
        for (int i = 0; i < timeStamp.length; i ++) {
            if (timeStamp[i] >= 0) {
                tempMeetingCount ++;
                res = Math.max(res, tempMeetingCount);
            } else {
                tempMeetingCount --;
            }
        }
        
        return res;
    }
posted @ 2016-10-15 05:17  哇呀呀..生气啦~  阅读(380)  评论(0)    收藏  举报