LeetCode 题解工作台

最多可以参加的会议数目 II

给你一个 events 数组,其中 events[i] = [startDay i , endDay i , value i ] ,表示第 i 个会议在 startDay i 天开始,第 endDay i 天结束,如果你参加这个会议,你能得到价值 value i 。同时给你一个整数 k 表示你能参加…

category

4

题型

code_blocks

6

代码语言

hub

3

相关题

当前训练重点

困难 · 状态·转移·动态规划

bolt

答案摘要

我们先将会议按照开始时间从小到大排序,然后设计一个函数 $\text{dfs}(i, k)$ 表示从第 个会议开始,最多参加 个会议的最大价值和。答案即为 $\text{dfs}(0, k)$。 函数 $\text{dfs}(i, k)$ 的计算过程如下:

Interview AiBox logo

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

试试 AiBox 面试助手arrow_forward
description

题目描述

给你一个 events 数组,其中 events[i] = [startDayi, endDayi, valuei] ,表示第 i 个会议在 startDayi 天开始,第 endDayi 天结束,如果你参加这个会议,你能得到价值 valuei 。同时给你一个整数 k 表示你能参加的最多会议数目。

你同一时间只能参加一个会议。如果你选择参加某个会议,那么你必须 完整 地参加完这个会议。会议结束日期是包含在会议内的,也就是说你不能同时参加一个开始日期与另一个结束日期相同的两个会议。

请你返回能得到的会议价值 最大和 。

 

示例 1:

输入:events = [[1,2,4],[3,4,3],[2,3,1]], k = 2
输出:7
解释:选择绿色的活动会议 0 和 1,得到总价值和为 4 + 3 = 7 。

示例 2:

输入:events = [[1,2,4],[3,4,3],[2,3,10]], k = 2
输出:10
解释:参加会议 2 ,得到价值和为 10 。
你没法再参加别的会议了,因为跟会议 2 有重叠。你  需要参加满 k 个会议。

示例 3:

输入:events = [[1,1,1],[2,2,2],[3,3,3],[4,4,4]], k = 3
输出:9
解释:尽管会议互不重叠,你只能参加 3 个会议,所以选择价值最大的 3 个会议。

 

提示:

  • 1 <= k <= events.length
  • 1 <= k * events.length <= 106
  • 1 <= startDayi <= endDayi <= 109
  • 1 <= valuei <= 106
lightbulb

解题思路

方法一:记忆化搜索 + 二分查找

我们先将会议按照开始时间从小到大排序,然后设计一个函数 dfs(i,k)\text{dfs}(i, k) 表示从第 ii 个会议开始,最多参加 kk 个会议的最大价值和。答案即为 dfs(0,k)\text{dfs}(0, k)

函数 dfs(i,k)\text{dfs}(i, k) 的计算过程如下:

如果不参加第 ii 个会议,那么最大价值和就是 dfs(i+1,k)\text{dfs}(i + 1, k);如果参加第 ii 个会议,我们可以通过二分查找,找到第一个开始时间大于第 ii 个会议结束时间的会议,记为 jj,那么最大价值和就是 dfs(j,k1)+value[i]\text{dfs}(j, k - 1) + \text{value}[i]。取二者的较大值即可。即:

dfs(i,k)=max(dfs(i+1,k),dfs(j,k1)+value[i])\text{dfs}(i, k) = \max(\text{dfs}(i + 1, k), \text{dfs}(j, k - 1) + \text{value}[i])

其中 jj 为第一个开始时间大于第 ii 个会议结束时间的会议,可以通过二分查找得到。

由于函数 dfs(i,k)\text{dfs}(i, k) 的计算过程中,会调用 dfs(i+1,k)\text{dfs}(i + 1, k)dfs(j,k1)\text{dfs}(j, k - 1),因此我们可以使用记忆化搜索,将计算过的值保存下来,避免重复计算。

时间复杂度 O(n×logn+n×k)O(n \times \log n + n \times k),空间复杂度 O(n×k)O(n \times k),其中 nn 为会议数量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution:
    def maxValue(self, events: List[List[int]], k: int) -> int:
        @cache
        def dfs(i: int, k: int) -> int:
            if i >= len(events):
                return 0
            _, ed, val = events[i]
            ans = dfs(i + 1, k)
            if k:
                j = bisect_right(events, ed, lo=i + 1, key=lambda x: x[0])
                ans = max(ans, dfs(j, k - 1) + val)
            return ans

        events.sort()
        return dfs(0, k)
speed

复杂度分析

指标
时间complexity is O(n * (k + log n)) because for each event and each possible attended count up to k, binary search is performed to find the next compatible event. Space complexity is O(n * k) to store the DP table for state transitions.
空间O(n \cdot k)
psychology

面试官常问的追问

外企场景
  • question_mark

    They may ask about handling overlapping events efficiently using binary search after sorting.

  • question_mark

    Expect questions on optimizing DP transitions for large n * k to avoid timeouts.

  • question_mark

    Clarify why attending fewer than k events may be optimal if higher-value events overlap.

warning

常见陷阱

外企场景
  • error

    Forgetting that end days are inclusive, which causes overlaps if not handled carefully.

  • error

    Not sorting events before binary search, leading to incorrect next-event selection.

  • error

    Assuming you must attend exactly k events instead of at most k, which can reduce total value.

swap_horiz

进阶变体

外企场景
  • arrow_right_alt

    Modify to return the actual sequence of events that maximizes value, not just the sum.

  • arrow_right_alt

    Change k to be dynamic per event, allowing variable attendance limits.

  • arrow_right_alt

    Introduce additional constraints such as minimum rest days between events.

help

常见问题

外企场景

最多可以参加的会议数目 II题解:状态·转移·动态规划 | LeetCode #1751 困难