[Leetcode]253. 会议室 II(数组/堆)

题目

给定一个会议时间安排的数组,每个会议时间都会包括开始和结束的时间 [[s1,e1],[s2,e2],...] (si < ei),为避免会议冲突,同时要考虑充分利用会议室资源,请你计算至少需要多少间会议室,才能满足这些会议安排。

示例 1:

输入: [[0, 30],[5, 10],[15, 20]]
输出: 2
示例 2:

输入: [[7,10],[2,4]]
输出: 1

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/meeting-rooms-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

这道题的重点是可以抛弃到开始时间和结束时间的对应关系,因为它没用
方法一:指针
1 开两个一维数组,分别存放开始时间、结束时间。
2 数组排序。
3 两个数组分别维护一个指针,均初始化为第一个位置,然后按时间顺序右移指针。
4 维护房间数roomCnt=begIdx+1-endIdx,它的最大值即为所求。

方法二:堆
1 用最小堆堆存结束时间,堆顶元素即为最快结束的房间。
2 按开始时间排序会议,遍历数组,每次比较该元组结束时间和堆顶元素,若堆顶元素即结束时间大于该起始时间,则将结束时间加入堆,若小于则更新堆顶元素
3 最终堆的size即为所求

代码

方法一

class Solution {
    public int minMeetingRooms(int[][] intervals) {
        if(intervals==null||intervals.length==0){
            return 0;
        }

        int len=intervals.length;//
        int[] end=new int[len];
        int[] beg=new int[len];
        
        for(int i=0;i<intervals.length;++i){
            end[i]=intervals[i][1];
            beg[i]=intervals[i][0];
        }

        Arrays.sort(end);
        Arrays.sort(beg);

        
        int idxBeg=0;
        int idxEnd=0;
        int maxRoomCnt=0;
        int roomCnt=0;
        while(idxBeg<len&&idxEnd<len){//
            roomCnt=idxBeg+1-idxEnd;
            maxRoomCnt=roomCnt>maxRoomCnt?roomCnt:maxRoomCnt;

            if(idxBeg!=len-1&&beg[idxBeg+1]<end[idxEnd]){//
                idxBeg++;
            }else{
                idxEnd++;
            }
        }
        return maxRoomCnt;
    }
}

posted on 2020-11-03 22:55  coding_gaga  阅读(806)  评论(0编辑  收藏  举报

导航