• 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();
        }
    }
  • 相关阅读:
    request和response使用
    oracle_to_char
    oracl_LTRIM_RITRIM
    convert
    jdbc
    oracle_trunc
    [python]glob模块中的glob()函数为什么返回空列表??
    win10 anaconda+tensorflow+keras
    Golang学习:sublime text3配置golang环境
    2018/12/05学习笔记
  • 原文地址:https://www.cnblogs.com/fatttcat/p/9983868.html
Copyright © 2020-2023  润新知