LeetCode 题解工作台
两个最好的不重叠活动
给你一个下标从 0 开始的二维整数数组 events ,其中 events[i] = [startTime i , endTime i , value i ] 。第 i 个活动开始于 startTime i ,结束于 endTime i ,如果你参加这个活动,那么你可以得到价值 value i 。你…
5
题型
6
代码语言
3
相关题
当前训练重点
中等 · 状态·转移·动态规划
答案摘要
我们可以讲活动按照开始排序,然后预处理出以每个活动为作为开始的最大价值,即 表示从第 个活动开始,到最后一个活动结束,选择其中一个活动的最大价值。 然后我们枚举每个活动,对于每个活动,我们使用二分查找找到第一个开始时间大于当前活动结束时间的活动,下标记为 ,那么以当前活动为开始的最大价值就是 ,加上当前活动的价值,即为以当前活动为第一个活动,最终能获得的最大价值。求最大值即可。
Interview AiBoxInterview AiBox 实时 AI 助手,陪你讲清 状态·转移·动态规划 题型思路
题目描述
给你一个下标从 0 开始的二维整数数组 events ,其中 events[i] = [startTimei, endTimei, valuei] 。第 i 个活动开始于 startTimei ,结束于 endTimei ,如果你参加这个活动,那么你可以得到价值 valuei 。你 最多 可以参加 两个时间不重叠 活动,使得它们的价值之和 最大 。
请你返回价值之和的 最大值 。
注意,活动的开始时间和结束时间是 包括 在活动时间内的,也就是说,你不能参加两个活动且它们之一的开始时间等于另一个活动的结束时间。更具体的,如果你参加一个活动,且结束时间为 t ,那么下一个活动必须在 t + 1 或之后的时间开始。
示例 1:

输入:events = [[1,3,2],[4,5,2],[2,4,3]] 输出:4 解释:选择绿色的活动 0 和 1 ,价值之和为 2 + 2 = 4 。
示例 2:

输入:events = [[1,3,2],[4,5,2],[1,5,5]] 输出:5 解释:选择活动 2 ,价值和为 5 。
示例 3:

输入:events = [[1,5,3],[1,5,1],[6,6,5]] 输出:8 解释:选择活动 0 和 2 ,价值之和为 3 + 5 = 8 。
提示:
2 <= events.length <= 105events[i].length == 31 <= startTimei <= endTimei <= 1091 <= valuei <= 106
解题思路
方法一:排序 + 二分查找
我们可以讲活动按照开始排序,然后预处理出以每个活动为作为开始的最大价值,即 表示从第 个活动开始,到最后一个活动结束,选择其中一个活动的最大价值。
然后我们枚举每个活动,对于每个活动,我们使用二分查找找到第一个开始时间大于当前活动结束时间的活动,下标记为 ,那么以当前活动为开始的最大价值就是 ,加上当前活动的价值,即为以当前活动为第一个活动,最终能获得的最大价值。求最大值即可。
时间复杂度 ,空间复杂度 。其中 为活动的数量。
class Solution:
def maxTwoEvents(self, events: List[List[int]]) -> int:
events.sort()
n = len(events)
f = [events[-1][2]] * n
for i in range(n - 2, -1, -1):
f[i] = max(f[i + 1], events[i][2])
ans = 0
for _, e, v in events:
idx = bisect_right(events, e, key=lambda x: x[0])
if idx < n:
v += f[idx]
ans = max(ans, v)
return ans
复杂度分析
| 指标 | 值 |
|---|---|
| 时间 | O(n \cdot \log n) |
| 空间 | O(n) |
面试官常问的追问
外企场景- question_mark
Sorting by end times can simplify non-overlapping checks.
- question_mark
Using a DP array to store one-event maxima shows clear state transition understanding.
- question_mark
Binary search integration reveals awareness of combining past results efficiently.
常见陷阱
外企场景- error
Failing to account for inclusive end times and start times leading to overlap errors.
- error
Not storing the best single-event value up to each index, which makes combining events inefficient.
- error
Attempting a naive O(n^2) comparison between all pairs of events, exceeding time limits.
进阶变体
外企场景- arrow_right_alt
Maximizing sum for at most k non-overlapping events instead of two.
- arrow_right_alt
Events with weighted durations where value per unit time must be maximized.
- arrow_right_alt
Allowing overlapping events with a penalty to combine values differently.