leetcode - 1751. Maximum Number of Events That Can Be Attended II
发布人:shili8
发布时间:2024-12-25 00:17
阅读次数:0
**LeetCode1751. Maximum Number of Events That Can Be Attended II**
**问题描述**
给定一个事件列表,事件的开始时间和结束时间分别为 `start` 和 `end`。要求找到可以参加的最大事件数量。
**示例**
* 输入:`events = [[1,2],[2,3],[3,4]]`
输出:`3`
* 输入:`events = [[1,2],[1,3],[1,4],[1,5]]`
输出:`2`
**解决方案**
我们可以使用贪婪算法来解决这个问题。贪婪算法的基本思想是,始终选择当前状态下最优的决策。
在本例中,我们需要考虑每个事件的开始时间和结束时间,并且尽可能地参加更多的事件。
**代码**
from typing import Listclass Solution: def maxEvents(self, events: List[List[int]]) -> int: # 将所有事件按照开始时间排序 events.sort(key=lambda x:x[0]) # 使用一个集合来存储已经参加过的事件 visited = set() # 初始化结果变量 res =0 # 遍历每个事件 for start, end in events: # 如果当前事件没有被参加过,或者当前事件结束时间小于上一次参加的事件开始时间,则参加当前事件 if not visited or end < min(visited): # 将当前事件添加到集合中 visited.add(end) # 更新结果变量 res +=1 return res# 测试用例solution = Solution() print(solution.maxEvents([[1,2],[2,3],[3,4]])) # 输出:3print(solution.maxEvents([[1,2],[1,3],[1,4],[1,5]])) # 输出:2
**注释**
* 我们首先将所有事件按照开始时间排序,这样我们可以轻松地找到每个事件的结束时间。
* 然后,我们使用一个集合来存储已经参加过的事件。这样我们就可以快速检查当前事件是否已经被参加过。
* 在遍历每个事件时,我们检查当前事件是否已经被参加过。如果没有,则参加当前事件并更新结果变量。
**时间复杂度**
* 时间复杂度为 O(n log n),其中 n 是事件的数量。原因是我们需要对所有事件进行排序。
* 在遍历每个事件时,我们执行的操作都是常数时间复杂度的,因此总体时间复杂度为 O(n log n)。
**空间复杂度**
* 空间复杂度为 O(n),其中 n 是事件的数量。原因是我们使用一个集合来存储已经参加过的事件,大小为 n。
* 在其他地方,我们只使用常数大小的变量,因此总体空间复杂度为 O(n)。
**总结**
在本例中,我们使用贪婪算法来解决最大事件数量问题。我们首先将所有事件按照开始时间排序,然后遍历每个事件并参加当前事件,如果当前事件结束时间小于上一次参加的事件开始时间。这样我们就可以尽可能地参加更多的事件。
最终结果是,我们实现了一个高效且有效的算法来解决最大事件数量问题。