zoukankan      html  css  js  c++  java
  • 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;
        }
    
  • 相关阅读:
    子元素过滤器nth-child解释
    jquery属性选择器中|value和^value的区别
    [转]float,double和decimal类型
    postsharp初体验
    [札记]IL经典指令解析之方法调度
    Oracle问题诊断过程常用SQL
    在chrome浏览器中 页面生成二维码
    音视频实例
    html5 新增input类型与属性
    html5 form-Validity验证函数
  • 原文地址:https://www.cnblogs.com/reboot329/p/5962682.html
Copyright © 2011-2022 走看看