LeetCode 会议室 II

2 篇文章 0 订阅
2 篇文章 0 订阅
会议室 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();
    }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值