网易首页 > 网易号 > 正文 申请入驻

2025-07-21:不重叠区间的最大得分。用go语言,给定一个二维整数数组 intervals,其中每个元素 interval

0
分享至

2025-07-21:不重叠区间的最大得分。用go语言,给定一个二维整数数组 intervals,其中每个元素 intervals[i] = [li, ri, weighti] 表示一个区间,起点是 li,终点是 ri,权重是 weighti。你最多可以选出 4 个互不重叠的区间,使得这些被选区间的权重总和最大。

这里的“互不重叠”指的是两个区间之间没有任何交集,且如果两个区间在边界点(左端点或右端点)重合,也视为重叠,不能同时选择。

最终需要返回一个数组,包含所选区间的下标,最多 4 个,并且在所有得分最高的组合中,选出字典序最小的那一个。

1 <= intervals.length <= 5 * 10000。

intervals[i].length == 3。

intervals[i] = [li, ri, weighti]。

1 <= li <= ri <= 1000000000。

1 <= weighti <= 1000000000。

输入: intervals = [[5,8,1],[6,7,7],[4,7,3],[9,10,6],[7,8,2],[11,14,3],[3,5,5]]。

输出: [1,3,5,6]。

解释:

可以选择下标为 1、3、5 和 6 的区间,其权重分别为 7、6、3 和 5。

题目来自力扣3414。

解决步骤

  1. 1.数据预处理

  • • 将每个区间及其原始下标存储为一个元组(tuple),包含左端点(l)、右端点(r)、权重(weight)和原始下标(i)。

  • • 根据右端点对所有区间进行排序。这样做的目的是为了方便后续的动态规划处理,因为按右端点排序后,可以更容易地找到不与当前区间重叠的前驱区间。

2.动态规划初始化

  • • 定义一个动态规划数组f,其中f[i][j]表示从前i个区间中选择最多j个不重叠区间时的最大权重和及其对应的区间下标组合。

  • f是一个二维数组,大小为(n+1) x 5,其中n是区间的数量。5是因为最多可以选择 4 个区间(包括 0 个区间的情况)。

3.动态规划填充

  • • 遍历排序后的区间,对于每个区间t,尝试将其加入到已有的选择中。

  • • 对于每个可能的区间数量j(从 1 到 4):

    • • 找到所有右端点小于当前区间t的左端点的区间。这些区间可以与t不重叠。这一步通过二分查找实现,找到第一个右端点大于等于t.l的区间,其左边的区间就是可能的前驱。

    • • 计算两种情况的权重和:

      • • 不选择当前区间t:直接继承f[i][j]的值。

      • • 选择当前区间t:权重和为f[k][j-1].sum + t.weight,其中k是前驱区间的数量。

    • • 比较这两种情况,选择权重和较大的那个。如果权重和相同,选择字典序较小的下标组合。

    • • 更新f[i+1][j]为当前最优解。

4.结果提取

  • • 最终的最大权重和及其对应的区间下标组合存储在f[n][4]中。

  • • 返回f[n][4].id,即所选区间的下标。

时间复杂度
  • • 排序区间:O(n log n)

  • • 动态规划填充:

    • • 外层循环遍历n个区间。

    • • 内层循环遍历 4 个可能的区间数量。

    • • 对于每个区间和数量,需要进行一次二分查找(O(log n))。

    • • 因此,动态规划部分的时间复杂度为O(n * 4 * log n) = O(n log n)

  • • 总时间复杂度:O(n log n)

空间复杂度
  • • 存储排序后的区间:O(n)

  • • 动态规划数组fO(n * 5) = O(n)

  • • 存储每个状态的区间下标组合:最坏情况下可能需要O(n * 4)的空间(每个状态存储最多 4 个下标)。

  • • 总空间复杂度:O(n)

总结
  • • 时间复杂度:O(n log n)

  • • 空间复杂度:O(n)

Go完整代码如下:

package main import (     "fmt"     "slices"     "sort" ) func maximumWeight(intervals [][]int) []int {     type tuple struct{ l, r, weight, i int }     a := make([]tuple, len(intervals))     for i, interval := range intervals {         a[i] = tuple{interval[0], interval[1], interval[2], i}     }     slices.SortFunc(a, func(a, b tuple)int { return a.r - b.r })     n := len(intervals)     type pair struct {         sum int         id  []int     }     f := make([][5]pair, n+1)     for i, t := range a {         k := sort.Search(i, func(k int)bool { return a[k].r >= t.l })         for j := 1; j < 5; j++ {             s1 := f[i][j].sum             // 为什么是 f[k] 不是 f[k+1]:上面算的是 >= t.l,-1 后得到 < t.l,但由于还要 +1,抵消了             s2 := f[k][j-1].sum + t.weight             if s1 > s2 {                 f[i+1][j] = f[i][j]                 continue             }             newId := slices.Clone(f[k][j-1].id)             newId = append(newId, t.i)             slices.Sort(newId)             if s1 == s2 && slices.Compare(f[i][j].id, newId) < 0 {                 newId = f[i][j].id             }             f[i+1][j] = pair{s2, newId}         }     }     return f[n][4].id } func main() {     intervals := [][]int{{5, 8, 1}, {6, 7, 7}, {4, 7, 3}, {9, 10, 6}, {7, 8, 2}, {11, 14, 3}, {3, 5, 5}}     result := maximumWeight(intervals)     fmt.Println(result) }

Python完整代码如下:

# -*-coding:utf-8-*- from bisect import bisect_left from copyimport deepcopy def maximumWeight(intervals):     # 定义元组结构 l, r, weight, 原始下标 i     a = [(l, r, w, i) for i, (l, r, w) in enumerate(intervals)]     # 按右端点排序     a.sort(key=lambda x: x[1])          n = len(intervals)     # f[i][j] 存储选前 i 个区间,选 j 个区间时的最大权重和及对应的id列表     # 初始化为 sum=0,id=[]     f = [[{'sum':0, 'id':[]} for _ in range(5)] for _ in range(n+1)]     # 右端点单独提取,方便二分查找     ends = [item[1] for item in a]     for i, (l, r, w, idx) in enumerate(a):         # 找到第一个右端点 >= l 的区间位置         k = bisect_left(ends, l)         for j in range(1,5):             s1 = f[i][j]['sum']  # 不选第 i 个区间             # 选第 i 个区间,更新权重和             # f[k][j-1] 是不与当前区间重叠的组合             s2 = f[k][j-1]['sum'] + w             if s1 > s2:                 f[i+1][j] = f[i][j]             elif s1 < s2:                 new_id = deepcopy(f[k][j-1]['id'])                 new_id.append(idx)                 new_id.sort()                 f[i+1][j] = {'sum': s2, 'id': new_id}             else:  # s1 == s2,比较字典序,选字典序更小的                 new_id = deepcopy(f[k][j-1]['id'])                 new_id.append(idx)                 new_id.sort()                 if f[i][j]['id'] and f[i][j]['id'] < new_id:                     f[i+1][j] = f[i][j]                 else:                     f[i+1][j] = {'sum': s2, 'id': new_id}         # j=0 情况继承不变         f[i+1][0] = f[i][0]     return f[n][4]['id'] if __name__ == '__main__':     intervals = [[5, 8, 1], [6, 7, 7], [4, 7, 3], [9, 10, 6], [7, 8, 2], [11, 14, 3], [3, 5, 5]]     result = maximumWeight(intervals)     print(result)

我们相信Go语言和算法为普通开发者提供了困境的“面试利器”,并致力于分享全面的编程知识。在这里,您可以找到最新的Go语言教程、算法解析、提升面试竞争力的秘籍以及行业动态。 欢迎关注“福大规模架构师每日一题”,让 Go 语言和算法助力您的职业发展

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
恭喜!赵心童当选斯诺克年度MVP+进名人堂 吴宜泽获球迷票选最佳

恭喜!赵心童当选斯诺克年度MVP+进名人堂 吴宜泽获球迷票选最佳

我爱英超
2026-05-08 20:28:20
著名经济学家呼吁:给1.8亿农民涨养老金,比大搞投资来拉动GDP管用

著名经济学家呼吁:给1.8亿农民涨养老金,比大搞投资来拉动GDP管用

火锅局
2026-05-08 14:07:43
瞒了十几年!古天乐被曝隐婚生子,新娘竟 然是她?

瞒了十几年!古天乐被曝隐婚生子,新娘竟 然是她?

人间颂
2026-05-08 13:51:14
沙特翻脸!突然对美军关闭领空,特朗普连忙打电话化解,但未奏效;特朗普曾点名表扬:沙特做得很好,阿联酋也很好

沙特翻脸!突然对美军关闭领空,特朗普连忙打电话化解,但未奏效;特朗普曾点名表扬:沙特做得很好,阿联酋也很好

大风新闻
2026-05-08 15:36:05
摩托车撞倒3名过斑马线行人致2死,“时速超120公里,事发时疑在飙车”,被害人家属发声

摩托车撞倒3名过斑马线行人致2死,“时速超120公里,事发时疑在飙车”,被害人家属发声

澎湃新闻
2026-05-08 18:05:26
缺德到这种地步,已经不是讽刺的问题了!

缺德到这种地步,已经不是讽刺的问题了!

胖胖说他不胖
2026-05-08 08:55:19
伦敦世乒赛:日本女队登上领奖台!3:0大获全胜,4强对阵出炉

伦敦世乒赛:日本女队登上领奖台!3:0大获全胜,4强对阵出炉

国乒二三事
2026-05-08 18:36:22
国际足联终于慌了!新方案紧急出炉,世界杯版权迎来重大转机

国际足联终于慌了!新方案紧急出炉,世界杯版权迎来重大转机

社会日日鲜
2026-05-08 04:12:52
保时捷销量暴跌92.7%!从加价50万到6折甩卖,背后原因引发关注!

保时捷销量暴跌92.7%!从加价50万到6折甩卖,背后原因引发关注!

老特有话说
2026-05-08 17:06:36
急疯了!国际足联三降转播费求央视,6200万红线绝不退让

急疯了!国际足联三降转播费求央视,6200万红线绝不退让

黑鹰观军事
2026-05-08 15:32:42
第1现场|红场阅兵在即:首次取消展示重型装备,俄再次呼吁撤离基辅

第1现场|红场阅兵在即:首次取消展示重型装备,俄再次呼吁撤离基辅

澎湃新闻
2026-05-08 18:48:28
5月8日俄乌:乌克兰以牙还牙;无人机猛炸俄罗斯

5月8日俄乌:乌克兰以牙还牙;无人机猛炸俄罗斯

山河路口
2026-05-08 17:28:40
向导掐人中救醒高反昏迷女子反遭掌掴,有网友称其“装晕想免费下山”,女子否认:已报警;被打向导发声:她严重高反或因幻觉打人,已道歉

向导掐人中救醒高反昏迷女子反遭掌掴,有网友称其“装晕想免费下山”,女子否认:已报警;被打向导发声:她严重高反或因幻觉打人,已道歉

都市快报橙柿互动
2026-05-08 12:27:22
一艘中国船东所有的油轮遇袭,外交部:船上有中国籍船员,目前暂无伤亡情况

一艘中国船东所有的油轮遇袭,外交部:船上有中国籍船员,目前暂无伤亡情况

澎湃新闻
2026-05-08 15:36:29
美军再次对多艘伊朗油轮发动空袭

美军再次对多艘伊朗油轮发动空袭

新华社
2026-05-08 21:13:24
小马云范小勤成年后首次直播:礼物刷屏不断 在线人数一度破7万

小马云范小勤成年后首次直播:礼物刷屏不断 在线人数一度破7万

快科技
2026-05-08 14:42:08
海参崴的街头,谁在出卖我们的历史尊严?

海参崴的街头,谁在出卖我们的历史尊严?

迷世书童H9527
2026-05-07 14:55:09
她是著名演员,巅峰时为爱淡出舞台近十年,如今回归上海仍是顶流

她是著名演员,巅峰时为爱淡出舞台近十年,如今回归上海仍是顶流

冷紫葉
2026-05-07 23:59:54
评论丨“4只皮皮虾1035元”店主去世,消费纠纷别变成人身攻击

评论丨“4只皮皮虾1035元”店主去世,消费纠纷别变成人身攻击

红星新闻
2026-05-08 17:43:33
三亚皮皮虾事件升级!43岁老板身亡,多人威胁店铺,顾客还有恶行

三亚皮皮虾事件升级!43岁老板身亡,多人威胁店铺,顾客还有恶行

不写散文诗
2026-05-08 15:19:45
2026-05-08 21:51:00
moonfdd incentive-icons
moonfdd
福大大架构师每日一题
1216文章数 67关注度
往期回顾 全部

科技要闻

SK海力士平均奖金600万 工服成相亲神器

头条要闻

"大衣哥"再度翻红:五一假期3天跑5场 累到"要保命"

头条要闻

"大衣哥"再度翻红:五一假期3天跑5场 累到"要保命"

体育要闻

他把首胜让给队友,然后用一年时间还清账单

娱乐要闻

古天乐被曝隐婚生子,新娘竟是她

财经要闻

特朗普全球关税又受阻,也能退款?

汽车要闻

MG 4X实车亮相 将于5月11日开启盲订

态度原创

艺术
数码
手机
本地
公开课

艺术要闻

探索施密德的油画,感受无法抵挡的艺术魅力!

数码要闻

华硕天选7系列发布 天选7 Pro/Pro Max已开启预约

手机要闻

大疆Osmo Pocket 4P开启预约

本地新闻

用苏绣的方式,打开江西婺源

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版