1353. 最多可以参加的会议数目(贪心算法)

给你一个数组 events,其中 events[i] = [startDayi, endDayi] ,表示会议 i 开始于 startDayi ,结束于 endDayi 。

你可以在满足 startDayi <= d <= endDayi 中的任意一天 d 参加会议 i 。注意,一天只能参加一个会议。

输入:events = [[1,2],[2,3],[3,4]]
输出:3
解释:你可以参加所有的三个会议。
第 1 天参加第一个会议。
第 2 天参加第二个会议。
第 3 天参加第三个会议。
示例 2:

输入:events= [[1,2],[2,3],[3,4],[1,2]]
输出:4
示例 3:

输入:events = [[1,4],[4,4],[2,2],[3,4],[1,1]]
输出:4

思路:为了能参加最多的会议,我们尽量每次参加开始时间最早的会议。 注意以下问题:

比如某会议时间是 [1,10],那么我们先尽量尝试第 1 天参加,如果参加了别的会议,再尝试第 2 天...
如果两个会议开始时间相同,我们优先选择结束时间早的那个会议。比如 [1,4] 和 [1,3],利用优先队列,第 1 天先参加 [1,3],第 2 天参加 [1,4]。
具体实现:
我们将 events 按照最小优先队列(小顶堆)的结构来储存,当队列不为空时,弹出队首元素,

1.判断能否参加会议,若结束时间小于当天,说明过期了不能参加,跳过;
2.如果可以参加,比较当天和开始时间:
  (1)如果当天大于开始时间,说明我们没有必要非在今天参加,把 [当天,结束时间]重新加入优先队列,以查找有没有只能在今天参加的会议;
  (2)如果当天等于开始时间,我们立即开始这个会议。因为优先队列保证开始时间相同时结束时间是递增的。

class Solution:
    def maxEvents(self, events: List[List[int]]) -> int:
        res = 0
        heapq.heapify(events) # 把events转化成堆结构
        print(events)
        cur = events[0][0]
        while events:
            s, e = heapq.heappop(events)
            # print([s,e])
            if e < cur: # 如果结束时间小于当前天,说明过期了,不能参加
                continue
            # 如果开始时间小于当天,我们也不必今天参加,可以在(当天,结束天)任何一天参加
            if s < cur: 
                heapq.heappush(events,[cur,e])
            else:
                cur = max(cur + 1,s + 1)
                res += 1
        return res 

链接:https://leetcode-cn.com/problems/maximum-number-of-events-that-can-be-attended/solution/xiang-jie-you-xian-dui-lie-tan-xin-suan-fa-by-z1m/

原文地址:https://www.cnblogs.com/USTC-ZCC/p/12928911.html