• 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;
        }
    
  • 相关阅读:
    JavaScript经典语录
    ERP部门的添加(十一)
    List<T>Contains, Exists, Any之间的优缺点对比
    LINQ学习之旅(六)
    ERP仓库管理系统查询(十)
    MVC中Asp.Net管道(二)
    appfog 添加数据库支持
    appfog 使用
    java.util.ResourceBundle 读取国际化资源或配置文件
    Java 如何中断和恢复线程的执行
  • 原文地址:https://www.cnblogs.com/reboot329/p/5962682.html
Copyright © 2020-2023  润新知