You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何找出由至多T个开区间之和构成的最长区间?(C/C++)

解决至多选T个区间使目标区间长度最大的问题

嘿,我来帮你梳理下这个问题!首先得先明确你说的“它们的和构成的区间”具体指哪种情况——毕竟这里有两种常见的解读,我都会帮你拆解清楚:


情况1:目标是区间并集的长度最大

如果你的需求是选至多T个区间,让它们的并集覆盖的总长度最大,那interval tree其实不是最直接的解法,咱们可以用「排序+动态规划」的思路来处理:

  1. 预处理排序:先把所有区间按照右端点y从小到大排序,这一步是为了后续的动态规划能高效查找。
  2. 动态规划定义:设dp[i][k]表示考虑前i个区间,恰好选了k个时能得到的最大并集长度。
  3. 状态转移逻辑:
    • 不选第i个区间:dp[i][k] = dp[i-1][k],直接继承前i-1个区间选k个的最优结果。
    • 选第i个区间:这时候要找到最后一个右端点小于当前区间左端点x的区间j(也就是和当前区间不重叠的最后一个区间),那么dp[i][k] = dp[j][k-1] + (y_i - x_i),也就是选前j个区间里的k-1个,再加上当前区间的长度。
    • 最终dp[i][k]取这两种选择里的最大值。
  4. 快速查找优化:为了快速找到上述的j,我们可以把所有区间的右端点存成数组,用二分查找定位,这样能把时间复杂度控制在O(nT logn),对于大多数场景来说足够高效。

如果T的数值接近n,还可以考虑贪心策略,但贪心只在区间互不重叠的场景下有效(直接选最长的T个),一旦有重叠,贪心可能得不到最优解,所以动态规划的思路更稳妥。


情况2:目标是端点求和后的区间长度最大

如果你的意思是把选中的所有区间的x相加作为总区间的左端点,y相加作为右端点,那么总长度就是sum(y_i) - sum(x_i) = sum(y_i - x_i)——这就简单多了!

因为每个区间的贡献是独立的,直接选长度y-x最大的至多T个区间就行:把所有区间按y-x从大到小排序,取前T个(如果总区间数n小于T,就全选),它们的长度和就是最大的总区间长度。


为什么interval tree不太适用?

Interval tree的核心优势是高效管理区间的重叠、包含关系,比如快速查询某个点被哪些区间覆盖,或者某段区间和哪些区间重叠。但对于“选至多T个区间求最大长度”这个问题,它没法直接给出最优的选择组合,反而排序+动态规划(或贪心)的思路更直接高效,不用额外维护复杂的树结构。

如果你说的“和构成的区间”是其他特殊场景(比如交集长度最大),可以再补充说明,我再帮你调整解法~

内容的提问来源于stack exchange,提问作者OkarinBro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:33:12