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

LeetCode 1024题保姆级攻略:用Python搞定视频拼接,快速排序+贪心算法实战解析

LeetCode 1024题保姆级攻略用Python搞定视频拼接快速排序贪心算法实战解析最近在刷LeetCode时遇到一道很有意思的题目——1024.视频拼接。这道题乍看简单实则暗藏玄机需要巧妙结合快速排序和贪心算法才能高效解决。作为算法爱好者我花了整整一个周末研究这道题现在把完整解题思路和Python实现分享给大家。1. 理解题目本质题目描述看似是关于视频剪辑实则是一个典型的区间覆盖问题。我们需要从给定的视频片段中选择最少数量的片段通过剪辑和拼接完整覆盖从0到time的整个时间段。举个例子输入clips [[0,2],[4,6],[8,10],[1,9],[1,5],[5,9]], time 10输出3解释选择[0,2], [8,10], [1,9]三个片段将[1,9]剪辑为[1,2][2,8][8,9]最终得到[0,2][2,8][8,10]覆盖[0,10]关键点在于片段可以自由剪辑即可以只使用片段的一部分需要覆盖完整的[0, time]区间目标是使用最少数量的片段2. 解题思路拆解2.1 为什么需要快速排序原始片段是无序的这会导致我们无法系统地遍历和选择片段。排序的目的是让所有片段按照起始时间升序排列这样我们才能从左到右依次处理。排序后的片段示例[[0,2],[1,9],[1,5],[4,6],[5,9],[8,10]]2.2 贪心算法的核心思想贪心算法在这里的应用是在每一步选择能够最大限度扩展当前覆盖范围的片段。具体来说维护两个关键变量current_end当前已覆盖区间的右端点next_end下一步能覆盖的最大右端点遍历排序后的片段如果片段的起始时间 ≤current_end说明它可以扩展当前覆盖范围在这些片段中选择能最大化next_end的片段当无法继续扩展时选择next_end作为新的current_end并增加片段计数3. Python代码实现def videoStitching(clips, time): # 先按起始时间排序 clips.sort() res 0 current_end, next_end 0, 0 i 0 n len(clips) while current_end time and i n: # 在所有起始时间current_end的片段中找最大的结束时间 while i n and clips[i][0] current_end: next_end max(next_end, clips[i][1]) i 1 if current_end next_end: # 无法继续扩展 return -1 current_end next_end res 1 return res if current_end time else -1代码解析clips.sort()快速排序Python内置的Timsortcurrent_end和next_end的维护是贪心算法的核心当无法继续扩展时current_end next_end返回-1最终检查是否完全覆盖[0, time]4. 关键变量维护示例让我们通过示例1来理解变量如何变化初始状态clips [[0,2],[1,9],[1,5],[4,6],[5,9],[8,10]] current_end 0, next_end 0, res 0第一轮处理[0,2],[1,9],[1,5]起始时间≤0的只有[0,2]next_end max(0, 2) 2current_end 2, res 1第二轮处理[1,9],[1,5],[4,6]起始时间≤2next_end max(2, 9,5,6) 9current_end 9, res 2第三轮处理[5,9],[8,10]起始时间≤9next_end max(9, 9,10) 10current_end 10 ≥ time(10)结束最终结果res 35. 复杂度分析时间复杂度O(nlogn)主要由排序决定空间复杂度O(1)只使用了常数个额外变量6. 边界情况处理在实际编码中有几个边界情况需要特别注意起始时间必须包含0如果所有片段的start都0直接返回-1可以在排序后检查第一个元素的start是否为0时间范围检查最终current_end必须≥time否则返回-1空输入处理如果clips为空且time0返回-1time0时返回0不需要任何片段修改后的健壮代码def videoStitching(clips, time): if time 0: return 0 if not clips: return -1 clips.sort() if clips[0][0] ! 0: return -1 res 0 current_end, next_end 0, 0 i 0 n len(clips) while current_end time and i n: while i n and clips[i][0] current_end: next_end max(next_end, clips[i][1]) i 1 if current_end next_end: return -1 current_end next_end res 1 return res if current_end time else -17. 测试用例验证为了确保代码的正确性我们需要设计多种测试用例基本用例assert videoStitching([[0,2],[4,6],[8,10],[1,9],[1,5],[5,9]], 10) 3无法覆盖的情况assert videoStitching([[0,1],[1,2]], 5) -1需要精确匹配的情况assert videoStitching([[0,4],[4,8],[8,10]], 10) 3边界情况assert videoStitching([], 10) -1 assert videoStitching([[1,2]], 1) -1 assert videoStitching([[0,0]], 0) 0复杂用例clips [[0,1],[6,8],[0,2],[5,6],[0,4],[0,3],[6,7],[1,3],[4,7],[1,4],[2,5],[2,6],[3,4],[4,5],[5,7],[6,9]] assert videoStitching(clips, 9) 38. 贪心算法的正确性证明为什么这种贪心策略能得到最优解我们可以从几个方面理解局部最优导致全局最优每次选择能最大限度扩展覆盖范围的片段确保不会错过更优的选择。无后效性当前的选择不会影响后续的选择因为所有起始时间≤current_end的片段都被考虑过了。数学归纳法基础情况第一个片段必须从0开始选择能覆盖最远的片段归纳步骤假设前k步是最优的那么第k1步选择能最大化扩展的片段也必然最优9. 与动态规划的比较这道题也可以用动态规划解决但贪心算法更高效方法时间复杂度空间复杂度实现难度贪心O(nlogn)O(1)中等DPO(n*time)O(time)较高贪心算法的优势在于不需要存储中间状态特别适合这种区间覆盖问题。10. 实际应用场景虽然题目描述是视频拼接但这种算法可以应用于会议日程安排选择最少的会议室覆盖所有会议广告投放选择最少的广告时段覆盖目标时间段资源分配用最少的资源块满足连续需求11. 常见错误与调试技巧在实现过程中我遇到过几个典型的错误排序错误错误只按start排序没有考虑start相同时的情况修正Python的sort()会按元组顺序比较所以不需要特殊处理变量更新时机错误错误在while循环外更新next_end修正必须在找到所有候选片段后再更新终止条件错误错误只检查i n而忽略current_end time修正需要同时满足两个条件调试时可以打印关键变量print(fi{i}, current{current_end}, next{next_end}, res{res})12. 算法优化空间虽然当前解法已经很高效但仍有优化可能提前终止当current_end time时可以立即返回当next_end time时可以提前计算剩余需要的片段数特殊输入处理如果存在单个片段覆盖全部时间直接返回1可以在排序后先检查是否有这样的片段优化后的代码片段# 在排序后添加检查 if clips[0][0] 0 and clips[0][1] time: return 113. 类似题目推荐掌握了这道题后可以尝试以下类似题目巩固贪心算法452.用最少数量的箭引爆气球435.无重叠区间56.合并区间1326.灌溉花园的最少水龙头数目这些题目都涉及区间处理和贪心选择解题思路有相通之处。14. 从这道题中学到的经验问题转化很重要将实际问题抽象为算法问题是关键第一步排序是预处理利器很多看似复杂的问题排序后就会变得清晰贪心需要证明不能凭直觉使用贪心要理解其正确性变量命名要清晰像current_end、next_end这样的命名大大提高了代码可读性这道题花了我不少时间理解但收获很大。区间类问题在面试中很常见掌握这种解题模式对算法提升很有帮助。建议读者亲自实现一遍代码用不同的测试用例验证才能真正掌握其中的精妙之处。

相关文章:

LeetCode 1024题保姆级攻略:用Python搞定视频拼接,快速排序+贪心算法实战解析

LeetCode 1024题保姆级攻略:用Python搞定视频拼接,快速排序贪心算法实战解析 最近在刷LeetCode时遇到一道很有意思的题目——1024.视频拼接。这道题乍看简单,实则暗藏玄机,需要巧妙结合快速排序和贪心算法才能高效解决。作为算法爱…...

思源宋体免费商用完全指南:从零基础到专业应用的7步解决方案

思源宋体免费商用完全指南:从零基础到专业应用的7步解决方案 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 还在为中文字体版权问题而烦恼?还在为寻找高质量且…...

AOT不是银弹,但它是你的护城河:C# 14 + Dify客户端在等保2.0三级/四级环境中的11项安全加固清单,限内部技术委员会解密

第一章:AOT不是银弹,但它是你的护城河:C# 14 Dify客户端在等保2.0三级/四级环境中的安全定位与战略价值 在等保2.0三级及以上环境中,运行时动态代码生成(如反射调用、JIT编译、Expression Tree执行)被明确…...

C# 14原生AOT编译Dify客户端全链路优化(成本控制黄金公式首次公开)

第一章:C# 14原生AOT编译Dify客户端全链路优化概览C# 14 引入的原生 AOT(Ahead-of-Time)编译能力,为构建高性能、低延迟、零运行时依赖的 Dify 客户端提供了全新路径。与传统 JIT 编译相比,AOT 可将 C# 代码直接编译为…...

告别玄学调试:手把手教你用GDB给Weston合成器“做体检”,定位Qt界面渲染异常

深入Weston合成器调试:用GDB精准定位Qt界面渲染异常 在嵌入式Linux图形开发中,Wayland/Weston组合已成为现代显示系统的首选方案。但当遇到像Qt下拉菜单无法正常关闭这类诡异问题时,仅靠日志打印往往难以触及问题本质。本文将带你使用GDB对We…...

从AVB到TSN:一文理清车载音视频网络的技术演进与选型避坑指南

从AVB到TSN:车载音视频网络的技术演进与选型实战 当特斯拉Model S首次将17英寸触摸屏引入汽车座舱时,很少有人意识到这背后隐藏着一场车载网络技术的革命。传统CAN总线2Mbps的带宽在4K视频流面前如同乡间小路面对高铁,而工程师们发现&#xf…...

从ViT的class token到Lora适配器:手把手教你用nn.Parameter为PyTorch模型注入可学习‘外挂’

从ViT的class token到Lora适配器:手把手教你用nn.Parameter为PyTorch模型注入可学习‘外挂’ 在深度学习模型的演进历程中,我们常常会遇到这样的需求:既希望保留预训练模型的核心结构,又需要为其添加特定任务的可学习组件。这种&q…...

在安卓手机上用Termux搭建Python数据分析环境:从安装到Jupyter配置的保姆级教程

在安卓手机上用Termux搭建Python数据分析环境:从安装到Jupyter配置的保姆级教程 想象一下,在地铁通勤的半小时里,你掏出手机就能完成数据清洗;在咖啡馆等人的间隙,随手调出Jupyter Lab验证一个算法假设——这就是Termu…...

MNIST识别准确率从95%到99%:我的PyTorch MLP调参实战与避坑记录

MNIST识别准确率从95%到99%:我的PyTorch MLP调参实战与避坑记录 当你的MNIST手写数字识别模型准确率卡在95%时,就像赛车手在弯道被对手死死咬住——明明知道还有提升空间,却找不到突破的发力点。作为经历过这个阶段的老司机,我将带…...

从LED到激光器:一文搞懂半导体光电子器件的核心原理与设计差异

从LED到激光器:半导体光电子器件的核心原理与设计差异解析 当我们在夜晚点亮一盏LED台灯,或是使用光纤网络高速下载文件时,背后是两类截然不同却又紧密相关的半导体光电器件在发挥作用。LED(发光二极管)和半导体激光器…...

Excel太宽导出PDF乱码?4个简单技巧帮你把Excel表格转成PDF

在日常办公中,我们经常会遇到Excel表格内容过宽的问题,比如数据列太多、表格横向延伸过长,导致打印或分享时排版混乱。这时候将Excel转为PDF格式就成了关键——PDF格式能完美保留表格的原始排版,避免内容错位,还能方便…...

【C# 14 原生 AOT 生产级部署实战】:Dify 客户端零依赖发布、启动速度提升300%、内存占用降低65%的7大硬核步骤

第一章:C# 14 原生 AOT 部署 Dify 客户端的生产级价值全景图C# 14 原生 AOT(Ahead-of-Time)编译能力与 Dify 开源大模型应用平台的深度协同,正在重塑企业级 AI 客户端交付范式。相比传统 JIT 部署,AOT 编译生成的单文件…...

从灯泡寿命到广告点击率:5个真实业务场景,手把手带你选对统计检验方法

当数据会说话:5个业务场景解锁统计检验的正确打开方式 市场部的Lisa盯着电脑屏幕上的A/B测试报告发愁——新旧页面的转化率差异究竟算不算显著?产品经理Mike正在对比培训前后30名客服的响应时长数据,却不确定该用哪种分析方法。这些场景每天都…...

手把手教你用Multisim仿真两相步进电机驱动:从电路搭建、波形验证到电荷泵稳压实战

手把手教你用Multisim仿真两相步进电机驱动:从电路搭建到性能优化全流程 在工业自动化和小型机电设备中,两相步进电机因其精准的位置控制和简单的驱动结构而广受欢迎。但直接在实际硬件上测试驱动电路存在风险,可能导致元器件损坏。这正是电路…...

Cursor Pro限制突破指南:如何免费享受高级AI编程功能

Cursor Pro限制突破指南:如何免费享受高级AI编程功能 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your tria…...

ArcGIS几何校正实战:从Google Earth获取控制点的完整流程

ArcGIS几何校正实战:从Google Earth获取控制点的完整流程 当你手头只有一张没有坐标参考的航拍图或卫星影像,却需要快速完成地理配准时,Google Earth提供的免费高分辨率底图能成为救命稻草。去年参与某次山区灾害评估时,我们团队就…...

BilibiliDown:一站式B站视频下载解决方案,轻松保存你喜欢的每一个视频

BilibiliDown:一站式B站视频下载解决方案,轻松保存你喜欢的每一个视频 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https:…...

“像河流一样编程”:从罗素的散文学习如何设计可维护的软件架构与优雅的代码生命周期

像河流一样编程:用自然哲学构建可持续的软件系统 当我们在键盘上敲下第一行代码时,很少会思考这段程序最终会以怎样的方式结束它的使命。就像罗素笔下那条始于山涧的小溪,每个软件系统都有其独特的生命周期轨迹——从激流勇进的初创期&#x…...

保姆级教程:在Ubuntu 20.04上从源码编译运行ORB_SLAM2(附TUM数据集测试)

从零构建ORB_SLAM2:Ubuntu 20.04实战指南与深度解析 在计算机视觉领域,同时定位与地图构建(SLAM)技术一直是研究热点。ORB_SLAM2作为特征点法的代表作,以其出色的实时性和精度成为众多开发者的首选。本文将带你从源码…...

Unity项目适配谷歌AAB+PAD:从强制迁移到高效部署的实战解析

1. 谷歌商店政策变迁:从APK到AAB的必然之路 记得2018年我第一次在谷歌商店发布Unity游戏时,用的还是传统的APKOBB模式。当时为了把200MB的游戏塞进100MB的限制里,不得不把核心资源都放到OBB文件中。没想到三年后,谷歌直接宣布全面…...

Dify知识库文档解析失败?揭秘PDF/Excel农技手册预处理的7个隐形坑(含OCR置信度校验Python脚本)

第一章:Dify知识库文档解析失败?揭秘PDF/Excel农技手册预处理的7个隐形坑(含OCR置信度校验Python脚本)农技手册常以扫描PDF、带复杂表格的Excel或图文混排的旧版印刷文档形式存在,直接导入Dify知识库极易触发“文档解析…...

STK 11.6.0 + MATLAB 实战:手把手教你用EOIR模块生成高分辨率对地成像图

STK 11.6.0与MATLAB联合实战:从零构建EOIR高分辨率成像工作流 当我们需要模拟复杂光学传感器对地观测场景时,STK的EOIR模块配合MATLAB后处理可以构建完整的解决方案。本文将带您走过从软件配置到最终成像的每个关键步骤,分享实际项目中积累的…...

Maxwell Simplorer Simulink 永磁同步电机矢量控制联合仿真

maxwell simplorer simulink 永磁同步电机矢量控制联合仿真,电机为分数槽绕组,使用pi控制SVPWM调制,修改文件路径后可使用,软件版本matlab 2017b, Maxwell electronics 2021b 共包含两个文件, Maxwell和Simplorer联合仿…...

告别费马小定理!用线性递推法在C++里高效搞定逆元(附完整代码)

告别费马小定理!用线性递推法在C里高效搞定逆元(附完整代码) 在算法竞赛和高性能计算领域,模运算中的逆元计算一直是困扰开发者的痛点。无论是计算组合数还是解决数论问题,传统方法往往面临效率瓶颈。想象一下&#xf…...

Dify边缘推理吞吐量翻倍实录:从12QPS到29QPS的4层内核级调优(含Linux sysctl深度参数表)

第一章:Dify边缘推理吞吐量翻倍实录:从12QPS到29QPS的4层内核级调优(含Linux sysctl深度参数表)在某工业边缘AI网关部署Dify v0.6.10时,初始单节点HTTP推理服务(基于FastAPI vLLM 0.4.2)实测稳…...

Qt串口通信GUI卡顿?试试用QThread把QSerialPort丢到子线程里(附完整工程源码)

Qt串口通信性能优化:多线程架构设计与实践指南 在工业自动化、医疗设备控制和嵌入式系统开发中,串口通信作为最基础的设备交互方式,其稳定性和响应速度直接影响整个系统的用户体验。当开发者使用Qt框架构建这类专业应用时,一个常见…...

别再让JSON字段毁了你的业务代码:从阿里商品中台案例看领域模型与数据模型的正确分工

领域模型与数据模型的分工艺术:从阿里商品中台实践看架构设计的本质 记得三年前接手一个电商促销系统重构时,我发现前任开发者将所有营销规则都塞进了一个名为promotion_rules的JSON字段里。当需要增加"限购地区"功能时,团队直接在…...

2026年OpenClaw阿里云8分钟云端集成零基础部署及使用教程【超详细】

2026年OpenClaw阿里云8分钟云端集成零基础部署及使用教程【超详细】。如何集成OpenClaw?还在为部署OpenClaw到处找教程踩坑吗?别再瞎折腾了!OpenClaw一键部署攻略来了,无需代码、只需两步,新手小白也能轻松拥有专属AI助…...

Dify医疗问答上线前最后72小时:必须完成的4层语义一致性验证(含Jieba+UMLS双引擎比对模板)

第一章:Dify医疗问答上线前最后72小时:必须完成的4层语义一致性验证(含JiebaUMLS双引擎比对模板)在Dify医疗问答系统正式交付前的72小时内,语义一致性验证是阻断临床术语误释、规避医患沟通风险的核心防线。我们采用四…...

图像图片照片风格转换API接口介绍

前言 在日常工作生活中,我们可能会需要将图片转化风格后再使用,比如把自己拍的照片转换成铅笔画。图像风格转换可以帮我们实现此功能,还可用于开展趣味活动,或集成到美图应用中对图像进行风格转换。 图像风格转换可将原始图像转…...