LeetCode 题解工作台

两个最好的不重叠活动

给你一个下标从 0 开始的二维整数数组 events ,其中 events[i] = [startTime i , endTime i , value i ] 。第 i 个活动开始于 startTime i ,结束于 endTime i ,如果你参加这个活动,那么你可以得到价值 value i 。你…

category

5

题型

code_blocks

6

代码语言

hub

3

相关题

当前训练重点

中等 · 状态·转移·动态规划

bolt

答案摘要

我们可以讲活动按照开始排序,然后预处理出以每个活动为作为开始的最大价值,即 表示从第 个活动开始,到最后一个活动结束,选择其中一个活动的最大价值。 然后我们枚举每个活动,对于每个活动,我们使用二分查找找到第一个开始时间大于当前活动结束时间的活动,下标记为 ,那么以当前活动为开始的最大价值就是 ,加上当前活动的价值,即为以当前活动为第一个活动,最终能获得的最大价值。求最大值即可。

Interview AiBox logo

Interview AiBox 实时 AI 助手,陪你讲清 状态·转移·动态规划 题型思路

试试 AiBox 面试助手arrow_forward
description

题目描述

给你一个下标从 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:

Example 1 Diagram

输入: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 <= 105
  • events[i].length == 3
  • 1 <= startTimei <= endTimei <= 109
  • 1 <= valuei <= 106
lightbulb

解题思路

方法一:排序 + 二分查找

我们可以讲活动按照开始排序,然后预处理出以每个活动为作为开始的最大价值,即 f[i]f[i] 表示从第 ii 个活动开始,到最后一个活动结束,选择其中一个活动的最大价值。

然后我们枚举每个活动,对于每个活动,我们使用二分查找找到第一个开始时间大于当前活动结束时间的活动,下标记为 idx\textit{idx},那么以当前活动为开始的最大价值就是 f[idx]f[\textit{idx}],加上当前活动的价值,即为以当前活动为第一个活动,最终能获得的最大价值。求最大值即可。

时间复杂度 O(n×logn)O(n \times \log n),空间复杂度 O(n)O(n)。其中 nn 为活动的数量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
speed

复杂度分析

指标
时间O(n \cdot \log n)
空间O(n)
psychology

面试官常问的追问

外企场景
  • 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.

warning

常见陷阱

外企场景
  • 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.

swap_horiz

进阶变体

外企场景
  • 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.

help

常见问题

外企场景

两个最好的不重叠活动题解:状态·转移·动态规划 | LeetCode #2054 中等