贪心算法---会议室问题

问题:

有一堆会议,每个会议都有开始时间和结束时间,问至少需要几个房间可以安排下这些会议?

解决思路:
这是个贪心类问题, 每个会议都有结束时间和开始时间,可以对两个时间分开存储并排序,从最先开始的会议开始遍历,只要当前会议的开始时间小于结束时间数组中的第一个结束时间,就需要重新开辟一个房间。接着看下一个会议的开始时间,如果开始时间依旧小于结束时间,那么还需要一个房间用作这个会议,如果开始时间大于等于结束时间,说明这个会议开始的时候,前面的会议中至少有一个已经结束了,此时不需要重新开辟一个新房间,复用即可,同时因为上一个结束时间已经过去了,所以结束时间数组下标指向下一个结束时间。

代码流程:

  1. 开始时间、结束时间分开排序;
  2. 从头开始遍历开始时间数组,如果当前开始时间小于结束时间,房间数 + 1, 开始时间下标向前移动,结束时间下标不动;
  3. 如果结束时间大于等于结束时间,开始时间向前移动,同时结束时间下标向前移动,房间数不变;

python 代码:

def meetingRoom(arr):
    
    start_time = []
    end_time = []
    
    for time in arr:
        start_time.append(time[0])
        end_time.append(time[1])
    
    start_time = sorted(start_time)
    end_time = sorted(end_time)
    
    res = 0
    j = 0
    for i in range(len(start_time)):
        if start_time[i] < end_time[j]:
            res += 1
        else:
            j += 1
    
    return res

解法二:
也可以使用小跟堆来做,但时间复杂度都一样,O(NlogN),具体思路也是将起始时间排序,然后遍历时间时,将每个结束时间压入堆中, 如果当前开始时间小于等于小跟堆的堆顶结束时间,从堆顶弹出一个元素,表示有一个会议室已经结束使用,可以复用该会议室。最后堆中剩下的元素个数就是所需的房间数。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值