LeetCode 会议室 II

会议室 II

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

示例 1:

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

示例 2:

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

这个题目有点类似于上下车问题。本题是规划的对于时间冲突的解决方案。
根据题目,我们发现,并不需要在意该会议持续时间。因为会议时间已经固定了,所以我们只需要关注会议室及其会议结束时间即可。因为只有会议时间结束,才能进行下一个会议。否则,这需要开一个新的会议室,去进行会议。为了最优开会成本和时间效率,下一个会议进入的房间,根据会议室结束时间和该会议开始时间的差决定,时间差越小,开会越能“无缝连接”,于是效率越高。

class Solution {
     
    public int minMeetingRooms(int[][] intervals) {
     
        if(intervals == null || intervals.length ==0)
            return 0;
        // 根据会议开始时间,数组的重新排序(开始时间的从小到大)
        Arrays.sort(intervals,new Comparator<>(){
     
			@Override
			public int compare(int[] o1, int[] o2) {
     
				return o1[0]-o2[0];
			}
        });
        // 定义一个HashMap记录会议室及其结束时间
        Map<Integer,Integer> RoomTime = new HashMap<>();
        // 第一个开始会议的已经毋庸置疑,就是开会时间最早的那个会议,也就是排序后的第一个会议
        RoomTime.put(1,intervals[0][1]);
        // 定义一个表示符号,用于后面的forEach跳过第一个会议,因为第一个会议已经安排好了
        boolean isFirst = false;
        for(int[] item :intervals){
     
            if(!isFirst)
            {
     
                // 跳过第一个会议,因为已经安排了
                isFirst = !isFirst;
                continue;
            }
            // 时间差
            int fix = 0;
            // 该会议,目前临时安排的房间
            int tempRoom = 0;
            // 循环所有会议室
            for(Map.Entry<Integer,Integer> entry: RoomTime.entrySet()){
     
                // 如果时间上满足要求
                if(entry.getValue() <= item[0])
                {
     
                    // 取最优的会议室给当前会议
                    if(fix == 0 || item[0] - entry.getValue() <= fix)
                    {
     
                        fix = item[0] - entry.getValue();
                        tempRoom = entry.getKey();
                    }
                }
            }
            // 如果临时间号不为0,则有房间满足要求。否则,说明没有房间满足要求,需要开一个新的会议室,安排该会议
            if(tempRoom != 0)
                RoomTime.put(tempRoom, item[1]);
            else
                RoomTime.put(RoomTime.size() + 1,item[1]);
        }
        // 最后返回房间的数量,即是本题的答案
        return RoomTime.size();
    }
}

你可能感兴趣的:(算法,leetcode,Java,算法,leetcode,java,数据结构)