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;
        }
    
  • 相关阅读:
    后台java,前台extjs文件下载
    gridPanel可拖拽排序
    Extjs 获取输入框焦点,并选中值
    java poi对Excel文件加密
    java poi 读取有密码加密的Excel文件
    SSL 与 数字证书 的基本概念和工作原理
    splay树
    树剖版lca
    树链剖分
    kruskal重构树
  • 原文地址:https://www.cnblogs.com/reboot329/p/5962682.html
Copyright © 2011-2022 走看看