253. Meeting Rooms II-贪婪

253. Meeting Rooms II-贪婪

题目

题目链接
给定一系列会议的开始结束时间: [[s1,e1],[s2,e2],…] (si < ei), 求需要的最小会议室个数。

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

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

思路

贪婪

  1. 定义

在每一步中都采取在当前状态下最好或最优的选择,从而希望导致结果最好或最优的算法

  1. 优点
    对一些问题,非常直观有效
  2. 缺点
    总是做出在当前看来是最好的选择,
    不从整体的角度去考虑,仅对局部的最优解感兴趣
    得到的结果往往不是正确的
    因为容易过早做出决定,导致不是最优解
    如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
  1. 适用问题:
    局部最优策略能产生全局最优策略的时候

贪婪适用

会议按起始时间依次召开,最早结束的才会空出,
所以维护一个最小堆,以开始时间顺序入堆(依次召开),以结束时间最小(贪婪,最早结束)的作为堆顶,每次新会议的开始时间和堆顶的结束时间比较就可以知道是否有会议室空出

代码


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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值