当前位置: 首页 > news >正文

(LeetCode 每日一题) 3440. 重新安排会议得到最多空余时间 II (贪心)

题目:3440. 重新安排会议得到最多空余时间 II

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
思路:(LeetCode 每日一题 ) 3439. 重新安排会议得到最多空余时间 I (滑动窗口)的进阶版。

在得到空闲数组v之后,本质就是枚举移动每一个活动,观察是否有除了其左右两边空闲位置外,还有没有不小于这个活动长度的空闲位置。细节看注释

C++版本:

class Solution {
public:int maxFreeTime(int eventTime, vector<int>& startTime, vector<int>& endTime) {// 空闲位置数组,空闲为0也要记录vector<int> v;int last=0;for(int i=0;i<startTime.size();i++){v.push_back(startTime[i]-last);last=endTime[i];}if(last<=eventTime){v.push_back(eventTime-last);}// q[i]表示:在i的右边最大的空闲位置int n=v.size();vector<int> q(n);q[n-1]=0;for(int i=n-2;i>=0;i--){q[i]=max(q[i+1],v[i+1]);}//已遍历过的空闲位置的最大值int mx=0;// 答案int ans=0;// 遍历,来枚举每一个活动被移动for(int i=1;i<n;i++){// 第一个活动和0之间有一个空闲位置,所以活动的下标是i-1// 第i-1活动左右两边空闲位置int t=v[i-1]+v[i];// 第i-1活动的长度int len=endTime[i-1]-startTime[i-1];// 有不小于这个活动长度的空闲位置if(len<=mx || len<=q[i]){// 可加上当前活动的长度lenans=max(ans,len+t);}else{// 只能将当前活动移动到左右两侧ans=max(ans,t);}// 维护已遍历过的空闲位置的最大值mx=max(mx,v[i-1]);}return ans;}
};

JAVA版本:

class Solution {public int maxFreeTime(int eventTime, int[] startTime, int[] endTime) {List<Integer> v=new ArrayList<>();int last=0;for(int i=0;i<startTime.length;i++){v.add(startTime[i]-last);last=endTime[i];}if(last<=eventTime){v.add(eventTime-last);}int n=v.size();int[] q=new int[n];q[n-1]=0;for(int i=n-2;i>=0;i--){q[i]=Math.max(q[i+1],v.get(i+1));}int mx=0;int ans=0;for(int i=1;i<n;i++){int t=v.get(i-1)+v.get(i);int len=endTime[i-1]-startTime[i-1];if(len<=mx || len<=q[i]){ans=Math.max(ans,len+t);}else{ans=Math.max(ans,t);}mx=Math.max(mx,v.get(i-1));}return ans;}
}

GO版本:

func maxFreeTime(eventTime int, startTime []int, endTime []int) int {v:=[]int{}n:=len(startTime)last:=0for i:=0;i<n;i++ {v=append(v,startTime[i]-last)last=endTime[i]}if last<=eventTime {v=append(v,eventTime-last)}n=len(v)q:=make([]int,n)q[n-1]=0for i:=n-2;i>=0;i-- {q[i]=max(q[i+1],v[i+1])}mx:=0ans:=0for i:=1;i<n;i++ {len:=endTime[i-1]-startTime[i-1]t:=v[i]+v[i-1]if len<=mx || len<=q[i] {ans=max(ans,t+len)}else{ans=max(ans,t)}mx=max(mx,v[i-1])}return ans
}
http://www.dtcms.com/a/272961.html

相关文章:

  • RabbitMQ消息队列——三个核心特性
  • LeetCode 1652. 拆炸弹
  • AI时代的接口调试与文档生成:Apipost 与 Apifox 的表现对比
  • Leetcode刷题营第十九题:对链表进行插入排序
  • Python 网络爬虫中 robots 协议使用的常见问题及解决方法
  • 图解 BFS 路径搜索:LeetCode1971
  • 芯片I/O脚先于电源脚上电会导致Latch-up(闩锁效应)吗?
  • Logback日志框架配置实战指南
  • 5种使用USB数据线将文件从安卓设备传输到电脑的方法
  • 【JavaScript 函数、闭包与 this 绑定机制深度解析】
  • 【C语言】指针笔试题2
  • 模块三:现代C++工程实践(4篇)第二篇《性能调优:Profile驱动优化与汇编级分析》
  • FlashAttention 快速安装指南(避免长时间编译)
  • QT网络通信底层实现详解:UDP/TCP实战指南
  • Centos 7下使用C++使用Rdkafka库实现生产者消费者
  • 【LeetCode 热题 100】19. 删除链表的倒数第 N 个结点——双指针+哨兵
  • 学习 Flutter (一)
  • html的outline: none;
  • C++STL-deque
  • 1. COLA-DDD的实战
  • 【基础架构】——软件系统复杂度的来源(低成本、安全、规模)
  • 告别卡顿与慢响应!现代 Web 应用性能优化:从前端渲染到后端算法的全面提速指南
  • IDEA运行Spring项目报错:java: 警告: 源发行版 17 需要目标发行版 17,java: 无效的目标发行版: 17
  • Cargo.toml 配置详解
  • 【科研绘图系列】R语言探索生物多样性与地理分布的可视化之旅
  • 网安-解决pikachu-rce乱码问题
  • 访问Windows服务器备份SQL SERVER数据库
  • (C++)任务管理系统(文件存储)(正式版)(迭代器)(list列表基础教程)(STL基础知识)
  • x86交叉编译ros 工程给jetson nano运行
  • Rust and the Linux Kernel