【LeetCode】1353. Maximum Number of Events That Can Be Attended 最多可以参加的会议数目

在这里插入图片描述
在这里插入图片描述
明显的贪心,把区间从小到大排序之后,发生的越早的、持续时间越短的会议越优先参加。
需要记录一下当前available的最早的天数(cur_s)。
比如:[1, 2], [1, 4], [2, 2], [3, 3], [5, 6]的情况
我们决定在第一天参加[1, 2]之后,cur_s就变成了2。
需要注意的是: 这时候在第2天才开始的会议就要加在一起讨论了!而那些在第1天开始的会议已经等价于在第2天才开始了(因为第1天已经被用了),也就是说,我们需要比较[2, 4](原[1, 4])和[2, 2]参加哪个。那显然end day越小的越先参加,因此我们需要用堆来维护当前最小的end day。

from heapq import heappush, heappop

class Solution:
    def maxEvents(self, events: List[List[int]]) -> int:
        events = list(sorted(events))
        # print(events)
        cnt, cur_s = 0, 1
        q = []
        for s, e in events:
            while q and cur_s < s:
                v = heappop(q)
                if v >= cur_s:
                    cnt += 1
                    # print([cur_s, v])
                    cur_s += 1
            heappush(q, e)
            cur_s = max(cur_s, s) # pay attention!
        while q:
            v = heappop(q)
            if v >= cur_s:
                cnt += 1
                # print([cur_s, v])
                cur_s += 1
        return cnt
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值