news 2026/6/10 1:48:46

leetcode 2054. 两个最好的不重叠活动 中等

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
leetcode 2054. 两个最好的不重叠活动 中等

给你一个下标从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 <= 10^5
  • events[i].length == 3
  • 1 <= startTimei <= endTimei <= 10^9
  • 1 <= valuei <= 10^6

分析:设取的第二个活动开始时间为 startTime,则问题转化为:遍历所有活动(作为取的第二个活动),如何取第一个活动使得参加的两个活动价值最大。

按照结束时间从小到大排序后,假设有如下两个活动:活动 A 结束于 3 时刻,价值 999。活动 B 结束于 6 时刻,价值 9。因为我们已经取了要参加的第二个活动,所以对于上面的这两个活动不关心开始时间。很明显,活动 B 是没有意义的,因为它的结束时间更晚,而价值更低。对于同样的第二个活动开始时间,取活动 A 作为第一个活动是更优的,活动 B 可以完全被活动 A 代替。

可以用一个数组,按照结束时间从小到大,活动价值从小到大记录可选的活动。由于之前已经按照结束时间升序排序,记录时只需要按照活动价值从小到大记录即可,类似于活动 A 和活动 B 的情况,只记录活动 A 即可。

遍历所有活动时,可以对这个记录数组进行二分查找,找到一个价值最大,且结束时间小于开始时间的活动,如果找不到,则当前活动只能单独取。最后取最大值作为答案。

typedef struct node { int endTime,value; }node; int cmp(const void *a,const void *b) { node *aa=(node*)a; node *bb=(node*)b; if(aa->endTime!=bb->endTime)return aa->endTime-bb->endTime; return aa->value-bb->value; } int maxTwoEvents(int** events, int eventsSize, int* eventsColSize) { node num[eventsSize+5],val[eventsSize+5]; for(int i=0;i<eventsSize;++i) num[i].endTime=events[i][1],num[i].value=events[i][2]; qsort(num,eventsSize,sizeof(node),cmp); int cnt=1; val[0].endTime=0,val[0].value=0; for(int i=0;i<eventsSize;++i) if(num[i].value>val[cnt-1].value)val[cnt]=num[i],cnt++; int ans=0; for(int i=0;i<eventsSize;++i) { int l=0,r=cnt,st=events[i][0],temp=events[i][2]; while(l<r) { int mid=(l+r)/2; if(val[mid].endTime<st)temp=val[mid].value+events[i][2],l=mid+1; else r=mid; } ans=fmax(ans,temp); } return ans; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 18:41:55

9个AI写作工具,MBA论文高效完成神器!

9个AI写作工具&#xff0c;MBA论文高效完成神器&#xff01; AI 写作工具&#xff0c;让 MBA 论文不再难 在当今快节奏的学术环境中&#xff0c;MBA 学生常常面临论文写作的压力。从选题到开题&#xff0c;从初稿到降重&#xff0c;每一步都需要耗费大量时间和精力。而随着 AI …

作者头像 李华
网站建设 2026/6/9 19:42:02

Open-AutoGLM导出PPT模糊、乱码?这7种常见问题一网打尽

第一章&#xff1a;Open-AutoGLM导出PPT模糊、乱码&#xff1f;这7种常见问题一网打尽在使用 Open-AutoGLM 进行演示文稿导出时&#xff0c;部分用户反馈生成的 PPT 存在图像模糊、文字乱码或格式错乱等问题。这些问题通常与字体嵌入、分辨率设置及后端渲染机制有关。以下是常见…

作者头像 李华
网站建设 2026/6/9 18:42:32

ISTA 1A 标准详解

ISTA 1A 标准详解ISTA 1A是由国际安全运输协会 (ISTA)制定的非模拟完整性性能测试程序&#xff0c;适用于重量不超过 150 磅 (68kg) 的单个包装产品&#xff0c;用于评估包装与产品组合在运输过程中抵抗常见危害 (振动、冲击) 的基础能力。一、核心定位与适用范围项目内容标准类…

作者头像 李华
网站建设 2026/6/9 18:39:41

探索加速工况下滚动轴承的打滑特性

An analytical model to investigate skidding in rolling element bearings during acceleration matlab轴承动力学建模&#xff0c;轴承打滑&#xff0c;球轴承打滑动力学建模&#xff0c;描述了加速工况下球轴承的打滑特性&#xff0c;非稳定工况&#xff0c;求得了滚动体和…

作者头像 李华
网站建设 2026/6/9 18:40:43

iOS app 为什么会抓不到包,不是配置没配好那么简单

在 iOS 开发过程中&#xff0c;“抓不到包”几乎是每个人都会遇到的情况。 刚开始时&#xff0c;这个问题往往被当成配置问题&#xff1a;代理是不是没开&#xff1f;证书是不是没信任&#xff1f;网络是不是没切到 Wi-Fi&#xff1f; 但当你确认这些都没问题&#xff0c;抓包工…

作者头像 李华