文章目录

  • 题目:1024. 视频拼接
  • 基本思想1:dfs(超时了)
  • 基本思想2:动态规划
  • 基本思想3:贪心算法

题目:1024. 视频拼接

你将会获得一系列视频片段,这些片段来自于一项持续时长为 T 秒的体育赛事。这些片段可能有所重叠,也可能长度不一。

视频片段 clips[i] 都用区间进行表示:开始于 clips[i][0] 并于 clips[i][1] 结束。我们甚至可以对这些片段自由地再剪辑,例如片段 [0, 7] 可以剪切成 [0, 1] + [1, 3] + [3, 7] 三部分。

我们需要将这些片段进行再剪辑,并将剪辑后的内容拼接成覆盖整个运动过程的片段([0, T])。返回所需片段的最小数目,如果无法完成该任务,则返回 -1 。

示例 1:

输入:clips = [[0,2],[4,6],[8,10],[1,9],[1,5],[5,9]], T = 10
输出:3
解释:
我们选中 [0,2], [8,10], [1,9] 这三个片段。
然后,按下面的方案重制比赛片段:
将 [1,9] 再剪辑为 [1,2] + [2,8] + [8,9] 。
现在我们手上有 [0,2] + [2,8] + [8,10],而这些涵盖了整场比赛 [0, 10]。

示例 2:

输入:clips = [[0,1],[1,2]], T = 5
输出:-1
解释:
我们无法只用 [0,1] 和 [1,2] 覆盖 [0,5] 的整个过程。

示例 3:

输入: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]], T = 9
输出:3
解释:
我们选取片段 [0,4], [4,7] 和 [6,9] 。

示例 4:

输入:clips = [[0,4],[2,8]], T = 5
输出:2
解释:
注意,你可能录制超过比赛结束时间的视频。

提示:

  • 1 <= clips.length <= 100
  • 0 <= clips[i][0] <= clips[i][1] <= 100
  • 0 <= T <= 100

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/video-stitching
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

基本思想1:dfs(超时了)

其实这道题本质上就是求 :最少几个区间的并集等于[0,T]

  • 首先将题目中给的区间进行排序,按照左边界排序,左边界相同,按照右边界排序
  • 按照区间进行dfs,考虑所有的情况取最小的。
class Solution {public:static bool cmp(vector<int> A, vector<int> B){if(A[0] != A[1])return A[0] < B[0];elsereturn A[1] < B[1];}int videoStitching(vector<vector<int>>& clips, int T) {sort(clips.begin(), clips.end(), cmp);int res = INT_MAX;vector<int> pre = {0, 0};dfs(clips, pre, 0, res, T, 0);return res == INT_MAX? -1 : res;}void dfs(vector<vector<int>>& clips, vector<int> pre, int cur, int &res, int T, int pos){if(pre[1] >= T && pre[0] == 0){res = min(res, cur);return;}for(int i = pos; i < clips.size(); ++i){//将当前区间和pre合并,if((pre[0] <= clips[i][0] && pre[1] >= clips[i][1]) || pre[1] < clips[i][0])continue;else{auto temp = pre;pre[0] = min(clips[i][0], pre[0]);pre[1] = max(clips[i][1], pre[1]);dfs(clips, pre, cur + 1, res, T, i + 1);pre = temp;//回溯}}}
};

基本思想2:动态规划

  • dp[i] :时间为 i 时,拼成片段的最小区间数
  • 状态:时间 i ,0……T
  • 选择:能够覆盖[0,T]的一部分区间中取最小的
  • 状态转移方程:如果当前区间[a,b], a < i <= b说明区间[a,b]能覆盖[0,T]的一部分区间。
    dp[i] = min(dp[i], dp[a] + 1)
class Solution {public:int videoStitching(vector<vector<int>>& clips, int T) {vector<int> dp(T + 1, T);dp[0] = 0;for (int i = 1; i <= T; i++) {for (auto& it : clips) {if (it[0] < i && i <= it[1]) {dp[i] = min(dp[i], dp[it[0]] + 1);}}}return dp[T] == T ? -1 : dp[T];}
};

基本思想3:贪心算法

  • 区间大才能保证所用的区间个数最少,所以首先统计每一个左边界的最大右边界,保存在数组中
  • 遍历数组,保存当前的最大右边界last和上一个区间的右边界pre;当当前和最大右边界last相等时说明不能构成最终区间;当当前和pre相等时,说明出现了新的区间,区间个数增加,并更新pre
class Solution {public:int videoStitching(vector<vector<int>>& clips, int T) {//贪心算法//首先统计每一个左边界的最大右边界vector<int> nums(T, 0);for(auto c : clips){if(c[0] < T)nums[c[0]] = max(nums[c[0]], c[1]);}int res = 0;int last = 0;//表示当前能到达的最右边界int pre = 0;//上一次的最右边界for(int i = 0; i < T; ++i){last = max(last, nums[i]);if(last == i)return -1;if(i == pre)//说明区间增加了一个{++res;pre = last;}}return res;}
};

leetcode1024. 视频拼接相关推荐

  1. 2个YUV视频拼接技术

    http://blog.csdn.net/huahuahailang/article/details/9040847 2个YUV视频拼接技术 http://zhongcong386.blog.163. ...

  2. 如何使用Autopano Video Pro进行全景视频拼接?

    from:http://news.expoon.com/c/20160816/15281.html 如何使用Autopano Video Pro进行全景视频拼接? 全景摄影一直很受欢迎,但是很少有摄影 ...

  3. 一种基于FPGA 的1080p 高清多摄像头全景视频拼接的泊车(机)

    < > 一种基于FPGA 的1080p 高清多摄像头全景视频拼接的泊车(机)实时影像系统 一.本发明要解决的实际问题 1. 汽车左右反光镜及后视镜的视角有限,导致车身周围存在盲区,在特殊驾 ...

  4. leetcode - 1024. 视频拼接

    1024. 视频拼接 -------------------------------------------- 你将会获得一系列视频片段,这些片段来自于一项持续时长为 T 秒的体育赛事.这些片段可能有 ...

  5. 3d怎么把两个面拼接在一起_视频拼接怎么做?如何将多段视频拼接在一起?

    视频拼接是一项比较简单的视频剪辑操作,最近同事艾琳娜来问我怎么把视频拼接在一起,才发现其实百度搜索到的方法都比较麻烦,要么就是需要付费,所以今天给大家介绍一个免费的视频拼接软件,大家可以试试用呀! 视 ...

  6. 全景视频拼接(一)--关键技术流程

     原文: http://blog.csdn.net/shanghaiqianlun/article/details/12090595 全景视频拼接关键技术 一.原理介绍 图像拼接(Image St ...

  7. IOS视频编辑,视频裁剪,视频拼接,音频处理,视频处理

    前言 用代码在简单视频编辑中,主要就是加美颜.水印(贴图).视频截取.视频拼接.音视频的处理,在美颜中,使用GPUImage即可实现多种滤镜.磨皮美颜的功能,并且可以脸部识别实时美颜等功能,这个有很多 ...

  8. 想要将多个视频拼接在一起?如何把三个视频合成一个视频

    从事短视频创作行业以来,总是存在着各种挑战.最开始,因为主要负责视频素材的搜集,所以每天虽忙但充实,最近逐步开始学习视频的剪辑工作,可把我难到了!想要将多个视频拼接在一起?如何把三个视频合成一个视频? ...

  9. Python 多个视频拼接成一个视频工具(附代码) | Python工具

    目录 前言 环境依赖 代码 总结 前言 本文提供将多个视频拼接为一个视频的Python工具代码,其中有一些限制条件,下面的代码说明会提到. 环境依赖 ffmpeg环境安装,可以参考我的另一篇文章:wi ...

最新文章

  1. git rebase教程
  2. Windows下使用Notepad++修改二进制文件,exe可执行文件
  3. 号码锁 Combination Lock
  4. Apache Subversion command line tools下载地址 svn命令行客户端
  5. 码云上传代码添加标签_第一次使用Git Bash Here 将本地代码上传到码云
  6. BrnShop开源网上商城第二讲:ASP.NET MVC框架
  7. 五大软件设计原则学习笔记3——Liskov 替换原则
  8. 云图说|一张图带你了解华为云分布式数据库中间件
  9. 在VB中如何让线程或进程在指定的CPU上运行
  10. OpenGL 自制API gluPerspective
  11. spring的bean注释_Spring @Bean注释
  12. linux脚本grep,linux shell 脚本之深入浅出的grep的用法
  13. Android studio 导包时,容易出现的问题【包括最新版本的问题】
  14. Visual Studio 2017正式版离线安装方法
  15. paip.variable xxx has initializer but incomplete type 解决方案
  16. 【从线性回归到BP神经网络】第二部分:线性回归
  17. jsp用javascript关于浏览器静止后退,刷新
  18. 解决windows软件默认安装到C盘问题
  19. 2019液晶电视机质量排名前十名
  20. 2019 年(B题)巡线机器人

热门文章

  1. 【电脑设置wifi大揭秘】随身wifi怎么用?
  2. 复旦大学2018--2019学年第一学期(18级)高等代数I期末考试第七大题解答
  3. 计算差分方程的收敛点_时间序列分析第一章 差分方程
  4. Hutool核心工具类之Convert万能转换器\String工具类之StrUtil\对象工具-ObjectUtil\数组工具-ArrayUtil\随机工具-RandomUtil等等
  5. 标签制作软件如何制作易碎品标签
  6. 电商直播系统源码:电商app的类型都有哪些?
  7. linux重启docker服务,如何解决Centos下Docker服务启动无响应,且输入docker命令无响应?...
  8. 实战端到端深度学习模拟无人驾驶
  9. java ee 组件_javaEE的核心API跟组件的关系
  10. 电阻测试仪都有哪些种类呢?