Leetcode 1024. 视频拼接(中等) 贪心算法
题目:
思路:
给定一个目标区间和若干小区间,如何通过裁剪和组合小区间拼凑出目标区间?最少需要几个小区间?
这道题的以下两个特点:
1、要用若干短视频凑出完成视频[0, T]
,至少得有一个短视频的起点是 0。
这个很好理解,如果没有一个短视频是从 0 开始的,那么区间[0, T]
肯定是凑不出来的。
2、如果有几个短视频的起点都相同,那么一定应该选择那个最长(终点最大)的视频。
基于以上两个特点,将clips
按照起点升序排序,起点相同的按照终点降序排序
我们会比较所有起点小于clips[0][1]
的区间,根据贪心策略,它们中终点最大的那个区间就是第二个会被选中的视频。
然后可以通过第二个视频区间贪心选择出第三个视频,以此类推,直到覆盖区间[0, T]
,或者无法覆盖返回 -1。
class Solution { public: int videoStitching(vector<vector<int>>& clips, int time) { // 按起点升序排列,起点相同的降序排列 sort(clips.begin(),clips.end(),[](vector<int>& a,vector<int>& b){ if(a[0]==b[0]) return a[1]>b[1]; return a[0]<b[0]; }); int n=clips.size(); int i=0; int curEnd=0,nextEnd=0; // 记录选择的短视频个数 int count=0; while(i<n&&clips[i][0]<=curEnd){ // 在第 res 个视频的区间内贪心选择下一个视频 // 选取起点在上一个选取视频终点前的区间中end最大的 while(i<n&&clips[i][0]<=curEnd){ nextEnd=max(nextEnd,clips[i][1]); i++; } // 找到下一个视频,更新 curEnd count++; curEnd=nextEnd; if(curEnd>=time){ // 已经可以拼出区间 [0, T] return count; } } // 无法连续拼出区间 [0, T] return -1; } };
联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=
分类:
leetcode
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
2021-03-04 Leetcode 41.第一个缺失的正数 tag 数组 hard
2021-03-04 [实践OK]CentOS下vim编辑器在可视模式下在secureCRT无法复制的办法。(转)
2016-03-04 android 打Patch的方法 .
2016-03-04 将packages/apps/下的app导入eclipse
2016-03-04 android源码framework下添加新资源的方法
2016-03-04 Framework/base 下添加自定义模块的步骤