zoukankan      html  css  js  c++  java
  • 253. Meeting Rooms II 需要多少间会议室

    [抄题]:

    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.

    For example,
    Given [[0, 30],[5, 10],[15, 20]],
    return 2.

     [暴力解法]:

    时间分析:

    空间分析:

     [优化后]:

    时间分析:

    空间分析:

    [奇葩输出条件]:

    [奇葩corner case]:

    首尾时间衔接上了,就业只需要一间

    [思维问题]:

    [一句话思路]:

    结束时间每次都取最小的,所以用heap来维持

    [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

    [画图]:

    [一刷]:

    1. heap中添加元素用的是吉利的offer方法,接口和具体实现用的是PQ

    [二刷]:

    [三刷]:

    [四刷]:

    [五刷]:

      [五分钟肉眼debug的结果]:

    [总结]:

    首尾时间衔接上了,就业只需要一间

    [复杂度]:Time complexity: O(n) Space complexity: O(n)

    [英文数据结构或算法,为什么不用别的数据结构或算法]:

    [算法思想:递归/分治/贪心]:

    [关键模板化代码]:

    heap模板:长度+三层:

    括号是空的表示构造函数

    / Use a min heap to track the minimum end time of merged intervals
        PriorityQueue<Interval> heap = new PriorityQueue<Interval>(intervals.length, new Comparator<Interval>() {
            public int compare(Interval a, Interval b) { return a.end - b.end; }
        });

    [其他解法]:

    [Follow Up]:

    [LC给出的题目变变变]:

     [代码风格] :

    /**
     * Definition for an interval.
     * public class Interval {
     *     int start;
     *     int end;
     *     Interval() { start = 0; end = 0; }
     *     Interval(int s, int e) { start = s; end = e; }
     * }
     */
    class Solution {
        public int minMeetingRooms(Interval[] intervals) {
            //cc : null
            if (intervals == null || intervals.length == 0) return 0;
            
            //ini : sort start, min heap for end, offer
            Arrays.sort(intervals, new Comparator<Interval>(){public int compare(Interval a, Interval b) 
                                                            {return a.start - b.start;}});
            
            PriorityQueue<Interval> heap = new PriorityQueue<Interval>(intervals.length, new Comparator<Interval>()
                                                     {public int compare(Interval a, Interval b) {return a.end - b.end;}});
            
            //for loop
            heap.offer(intervals[0]);
            for (int i = 1; i < intervals.length; i++) {
                //poll
                Interval curr = heap.poll();
                
                //compare end
                if (intervals[i].start >= curr.end) {
                    curr.end = intervals[i].end;
                }else {
                    heap.add(intervals[i]);
                }
                
                //put back
                heap.offer(curr);
            }
            
            return heap.size();
        }
    }
    View Code
  • 相关阅读:
    63.C++异常
    62.C++文件操作list实现内存检索,实现两千万数据秒查
    61.C++文件操作实现硬盘检索
    ios之数据持久化
    ios NSRange
    安排
    接口隔离原则
    Liskon替换原则
    开放封闭原则
    单一职责原则
  • 原文地址:https://www.cnblogs.com/immiao0319/p/9011014.html
Copyright © 2011-2022 走看看