题目
题目链接
给定一系列会议的开始结束时间: [[s1,e1],[s2,e2],…] (si < ei), 求需要的最小会议室个数。
输入: [[0, 30],[5, 10],[15, 20]]
输出: 2
输入: [[7,10],[2,4]]
输出: 1
思路
贪婪
- 定义
在每一步中都采取在当前状态下最好或最优的选择,从而希望导致结果最好或最优的算法
- 优点
对一些问题,非常直观有效 - 缺点
总是做出在当前看来是最好的选择,
不从整体的角度去考虑,仅对局部的最优解感兴趣
得到的结果往往不是正确的
因为容易过早做出决定,导致不是最优解
如01背包三种贪婪策略:
- 选取价值最大
物品ABC
重量 25 10 10
价值100 80 80
首先选择A,则无法达到最优解BC
2.选择重量最轻
物品ABC
重量 25 10 10
价值100 5 5
首先选择BC,则无法达到最优解A
3.选择价值/重量比最大的物品
物品ABC
重量 25 10 10
价值 25 10 10
首先选择A,则无法达到最优解BC
- 适用问题:
局部最优策略能产生全局最优策略的时候
贪婪适用
会议按起始时间依次召开,最早结束的才会空出,
所以维护一个最小堆,以开始时间顺序入堆(依次召开),以结束时间最小(贪婪,最早结束)的作为堆顶,每次新会议的开始时间和堆顶的结束时间比较就可以知道是否有会议室空出
代码
class Solution(object):
def minMeetingRooms(self, intervals):
"""
:type intervals: List[Interval]
:rtype: int
"""
# 1. 按起始时间排序
intervals.sort(key = lambda x: x.start)
# 2. 用最小堆维护开辟的所有会议室,按结束时间排序
heap = []
for interval in intervals:
# 3. 与堆顶的结束时间比较,如果晚于这个时间,说明已经有会议室空出
if heap and interval.start >= heap[0]:
heapq.heapreplace(heap, interval.end)
else: # 4. 最早结束的会议还没结束,说明全部都没空出,开辟新会议室
heapq.heappush(heap, interval.end)
# 5. 循环结束后堆中的元素个数就是最小所需会议室个数
return len(heap)