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

问题:

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

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

代码流程:

  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),具体思路也是将起始时间排序,然后遍历时间时,将每个结束时间压入堆中, 如果当前开始时间小于等于小跟堆的堆顶结束时间,从堆顶弹出一个元素,表示有一个会议室已经结束使用,可以复用该会议室。最后堆中剩下的元素个数就是所需的房间数。

猜你喜欢

转载自blog.csdn.net/yaogepila/article/details/107738125