给你一个数组 events,其中 events[i] = [startDayi, endDayi] ,表示会议 i 开始于 startDayi ,结束于 endDayi 。
你可以在满足 startDayi <= d <= endDayi 中的任意一天 d 参加会议 i 。注意,一天只能参加一个会议。
请你返回你可以参加的 最大 会议数目。
方法:
1.贪心,选择会议最早结束的优先参加,再以一个空间记录参加过的天数
2.贪心+优先队列,维护一个优先队列(小顶堆),选择会议开始时间最早的参加
1.如果当前天数>该时间段结束时间,跳过
2.如果当天天数>该时间段开始时间,将【当前天数,该时间段结束时间】插入堆,为什么这么做?因为这表示我这一天现在至少已经找到一个满足条件的了,但堆中说不定还有也满足当前天数并且结束时间更早的,所以现在找到的只是一个备选项
3.如果当天天数=该时间段开始时间,找到
核心就是说,我尽量选择开始的最早,结束的最早的情况
class Solution(object):
def maxEvents(self, events):
"""
:type events: List[List[int]]
:rtype: int
"""
events.sort(key=lambda x:x[1])
s=set()
for one in events:
for i in range(one[0],one[1]+1):
if i not in s:
s.add(i)
break
return len(s)
class Solution:
def maxEvents(self, events: List[List[int]]) -> int:
res = 0
heapq.heapify(events) # 把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