253. Meeting Rooms II - Medium

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();
    }
}

 

转载于:https://www.cnblogs.com/fatttcat/p/9983868.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值