[LeetCode]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.

这道题目比较有意思,记录一下大神的解法。

解法1 使用有序map

在Java中,TreeMap是有序map,对键进行了排序。
解题的思路是,用map记录房间瞬时的使用情况。
一个区间的开始,代表开启了一间房,结束,表明关闭了一间房。

我们遍历intervals,记录每一个时刻的开始数目和结束数目,然后按键从小到大遍历map,相当于遍历整个时间轴。我们需要的最小房间数,就是满足每个瞬时房间需求的房间数目。

代码如下:

    public int minMeetingRoomsWithmap(Interval[] intervals) {
        TreeMap<Integer, Integer> map = new TreeMap<>();
        for (Interval interval : intervals) {
            map.put(interval.start, map.getOrDefault(interval.start, 0) + 1);
            map.put(interval.end, map.getOrDefault(interval.end, 0) - 1);
        }
        int res = 0,mid = 0;
        for (int m : map.values()) {
            res = Math.max(res, mid += m);
        }
        return res;
    }

解法2,使用最小堆

首先,按照开始时间排序,然后用一个heap记录每个会议室的使用时间。同时heap是一个最小堆,可以取出最早结束的会议。
一开始,将最早开始的会议安排一个房间进heap。
之后遍历排序后的intervals。每当有一个新的会议要开始,从最小堆heap中查看最先要结束的会议,如果时间不冲突,直接将该会议室的结束时间扩展。如果时间冲突,安排一个新的会议室,推进heap。

    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<>((a, b) -> a.end - b.end);
        heap.add(intervals[0]);
        for (int i = 1;i<intervals.length;i++) {
            Interval now = heap.poll();
            if (intervals[i].start >= now.end) {
            //时间不冲突,原最早结束的会议室,时间扩展即可。
                now.end = intervals[i].end;
            }else {
            //时间冲突,添加新的会议室。
                heap.offer(intervals[i]);
            }
            heap.offer(now);
        }
        return heap.size();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值