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.

    Example 1:

    Input: [[0, 30],[5, 10],[15, 20]]
    Output: 2

    Example 2:

    Input: [[7,10],[2,4]]
    Output: 1

    M1:排序
    把interval的start和end取出来,并分别对start时间排序,end时间排序。设置res, end两个变量,对intervals进行遍历,如果starts[i] < ends[end],说明需要新房间,res++;否则,说明一个会议已经结束,可以安排在当前房间,不需要新房间,end++。(start, end都是有时间顺序的,所以一个end之前必然存在一个对应的start)

    Time Complexity: O(N) Space Complexity: O(N)

    class Solution {
        public int minMeetingRooms(Interval[] intervals) {
            int[] starts = new int[intervals.length];
            int[] ends = new int[intervals.length];
            for(int i = 0; i < intervals.length; i++) {
                starts[i] = intervals[i].start;
                ends[i] = intervals[i].end;
            }
            Arrays.sort(starts);
            Arrays.sort(ends);
            int res = 0, end = 0;
            for(int i = 0; i < intervals.length; i++) {
                if(starts[i] < ends[end])
                    res++;
                else
                    end++;
            }
            return res;
        }
    }


    M2:用min heap
    首先对intervals排序,按开始时间。用min heap记录merged intervals最小的结束时间。将intervals[0]加入heap。从intervals[1]开始,通过heap.poll()取到最早结束的会议,如果当前会议的开始时间大于(晚于)最早结束的会议的结束时间,说明可以继续用这个房间,不需要新的房间,因此合并两个interval(interval.end = intervals[i].end),反之则需要新的房间,在heap中加入当前interval,最后要记得把之前通过poll取出来比较的元素加回去。heap的大小就是最终结果。

    时间 O(NlogN) 空间 O(1)

    class Solution {
        public int minMeetingRooms(Interval[] intervals) {
            if (intervals == null || intervals.length == 0) return 0;
            Arrays.sort(intervals, (a, b) -> a.start - b.start);
            
            PriorityQueue<Interval> heap = new PriorityQueue<Interval>(intervals.length, (a, b) -> a.end - b.end);
            heap.offer(intervals[0]);
        
            for (int i = 1; i < intervals.length; i++) {
                Interval interval = heap.poll();
                if (intervals[i].start >= interval.end)
                    interval.end = intervals[i].end;
                else
                    heap.offer(intervals[i]);
            
                heap.offer(interval);
            }
            return heap.size();
        }
    }
  • 相关阅读:
    简析IGRP
    unicode字符集查找
    中国移动建成全球最大软交换网络 适合向3G过渡
    寻找端口与进程的关联
    framerelay
    网络工程师的素质
    E1通信的基础知识
    Indy UDP端口冲突解决
    『软考』接入网的分类
    随便写写。。
  • 原文地址:https://www.cnblogs.com/fatttcat/p/9983868.html
Copyright © 2011-2022 走看看