前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >LeetCode 1024. 视频拼接(动态规划/贪心)

LeetCode 1024. 视频拼接(动态规划/贪心)

作者头像
Michael阿明
发布于 2021-02-19 02:57:44
发布于 2021-02-19 02:57:44
52600
代码可运行
举报
运行总次数:0
代码可运行

文章目录

1. 题目

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
示例 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 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

2.1 动态规划

  • dp[t] 表示 t 时刻所需要的最小片段数,dp[0] = 0
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    int videoStitching(vector<vector<int>>& clips, int T) {
        int n = clips.size();
        vector<int> dp(T+1, INT_MAX);
        dp[0] = 0;
        for(int t = 0; t <= T; ++t) 
        {   //时间维度样本
            if(dp[t] == INT_MAX)
                break;//这个时间点不可到达,后续都不可能到达
            for(int i = 0; i < n; ++i)
            {   //遍历每个片段
                if(clips[i][0] <= t && t <= min(T,clips[i][1]))
                {   //该片段与时刻 t 有交集
                    for(int j = t+1; j <= min(T,clips[i][1]); ++j)
                    {   // 时刻 t 后面的可以到达
                        dp[j] = min(dp[j], dp[t]+1);
                    }
                }
            }
        }
        return dp[T]==INT_MAX ? -1 : dp[T];
    }
};

时间复杂度 O ( n T 2 ) O(nT^2) O(nT2) 12 ms 7.9 MB

或者 参考官方解法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    int videoStitching(vector<vector<int>>& clips, int T) {
        int n = clips.size();
        vector<long long> dp(T+1, INT_MAX);
        dp[0] = 0;
        for(int t = 0; t <= T; ++t) 
        {   //时间维度样本
            for(int i = 0; i < n; ++i)
            {   //遍历每个片段
                if(clips[i][0] <= t && t <= clips[i][1])
                {   //该片段与时刻 t 有交集
                    dp[t] = min(dp[t], dp[clips[i][0]]+1);
                }
            }
        }
        return dp[T]==INT_MAX ? -1 : dp[T];
    }
};

8 ms 7.7 MB

2.2 贪心

  • 先排序,按时间早的优先
  • 记录每次最远能到达的时间点,下次以这个最远的时间点,再次检查与之相交的区间
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    int videoStitching(vector<vector<int>>& clips, int T) {
        sort(clips.begin(), clips.end(),[&](auto& a, auto& b){
            return a[0] < b[0] ||(a[0] == b[0] && a[1] < b[1]);
        });
        int ans = 0, end = 0, nt_end = 0;
        for(int i = 0; i < clips.size() && end < T; )
        {
            if(clips[i][0] > end)
                break;
            else
            {
                while(i < clips.size() && clips[i][0] <= end)
                {	//跟本次能够接起来的片段
                    nt_end = max(nt_end, clips[i][1]);
                    //能达到的最远的时间点
                    i++;
                }
                end = nt_end;//下次能到达的时间点
                ++ans;
            }
        }
        return end < T ? -1 : ans;
    }   
};

时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn) 8 ms 7.7 MB


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/10/17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【一天一大 lee】视频拼接 (难度:中等) - Day20201024
你将会获得一系列视频片段,这些片段来自于一项持续时长为 T 秒的体育赛事。这些片段可能有所重叠,也可能长度不一。
前端小书童
2020/11/03
2860
【一天一大 lee】视频拼接 (难度:中等) - Day20201024
【算法提高班】《贪婪策略》系列 - 覆盖篇
LeetCode 上对于贪婪策略有 73 道题目。我们将其分成几个类型来讲解,截止目前我们暂时只提供覆盖问题,其他的可以期待我的新书或者之后的题解文章。
lucifer210
2020/02/26
6300
1024. Video Stitching
You are given a series of video clips from a sporting event that lasted T seconds. These video clips can be overlapping with each other and have varied lengths.
echobingo
2019/05/15
1.2K0
leetcode刷题记录——动态规划
首先找到数组 nums 中的最大元素值 maxNum。然后创建一个长度为 maxNum + 1 的数组 dp,用于记录删除元素值的获得的分数。
Andromeda
2023/12/25
1860
【LeetCode】 动态规划 刷题训练(三)
当处于 (row,col)位置处时,下一行 可以选择 (row+1,col)位置 / (row+1,col-1)位置 /(row+1,col+1)位置处的元素
lovevivi
2023/10/17
2140
【LeetCode】 动态规划 刷题训练(三)
LeetCode 1548. The Most Similar Path in a Graph(动态规划)
We have n cities and m bi-directional roads where roads[i] = [ai, bi] connects city ai with city bi. Each city has a name consisting of exactly 3 upper-case English letters given in the string array names. Starting at any city x, you can reach any city y where y != x (i.e. the cities and the roads are forming an undirected connected graph).
Michael阿明
2021/02/19
1.2K0
【算法设计与分析】六、动态规划:(二)上机-1、地牢逃生【理论到程序】
  用一个 n×n 的矩阵表示一座地牢,矩阵中第 i 行第 j 列的方格的值表示位置 (i,j) 的地势高度 h(i,j)。   时间 T=0 的时刻地牢开始下雨,当时间 T=t 时,地牢任意位置的水位都等于t 。任意时刻可以从当前位置游向上下左右四周相邻的任意一个位置,但是游动的前提是:此时水位必须淹没这个位置和其相邻位置,即如果在 T=t 时想从 (i,j) 位置移动到 (i,j+1) 位置,需要满足t≥h(i,j),t≥h(i,j+1) 。假定在方格内部游动不耗时。 时间 T 的取值是正整数。   求:从 (1,1) 位置出发,最少耗时多久可以到达 (n,n) 。
Qomolangma
2024/07/30
1261
【算法设计与分析】六、动态规划:(二)上机-1、地牢逃生【理论到程序】
动态规划:leetcode-174.地下城游戏, 怒刷一道困难级别题
其实很多时候一开始觉得很困难的问题,当你持续学习一段时间后,回过头来看,原来并不那么难,之所以难是因为你只是一时兴起,没能坚持学习。
小码匠
2022/06/16
2530
动态规划:leetcode-174.地下城游戏, 怒刷一道困难级别题
剪视频剪出一个贪心算法…
前面发过 几个视频,也算是对视频剪辑入了个门。像我这种非专业剪辑玩家,不做什么宏大特效电影镜头,只是做个视频教程,其实也没啥难度,只需要把视频剪流畅,所以用到最多的功能就是切割功能,然后删除和拼接视频片接。
labuladong
2021/09/23
6740
动态规划应用--“杨辉三角”最短路径 & LeetCode 120
对“杨辉三角"进行一些改造。每个位置的数字可以随意填写,经过某个数字只能到达下面一层相邻的两个数字。 假设你站在第一层,往下移动,我们把移动到最底层所经过的所有数字之和,定义为路径的长度。请你编程求出从最高层移动到最底层的最短路径。
Michael阿明
2021/02/20
8340
动态规划应用--“杨辉三角”最短路径 & LeetCode 120
【LeetCode】--- 动态规划 集训(二)
这⾥选择第⼆种定义状态表示的方式:dp[i][j]表示:走到 [i, j]位置处,⼀共有多少种方式。
用户11029269
2024/04/15
1580
【LeetCode】--- 动态规划 集训(二)
LeetCode 931. 下降路径最小和(动态规划)
下降路径可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列。
Michael阿明
2020/07/13
3920
LeetCode 2020 力扣杯全国春季编程大赛(1644/4093,前40.2%)
前两题比较顺利,24分钟做出来了,第3,4两题试了好久,都显示超时,第5题没心思看,想着第3,4题应该能做出来的。
Michael阿明
2020/07/13
4790
LeetCode 2020 力扣杯全国春季编程大赛(1644/4093,前40.2%)
【动态规划之斐波那契数列模型】——累加递推型动态规划
解题思路: 泰波那契数列的第 N 项定义为前面三项之和,即 T0 = 0, T1 = 1, T2 = 1,从 T3 开始,每一项都等于前三项的和。要找到第 N 项,可以使用动态规划逐步求解每个值直到 TN。
用户11286421
2025/05/19
620
天池 在线编程 放小球(动态规划)
n 个桶中小球的个数已知, 可以操作 k 次(每次从桶中取出一个球,或者添加一个球), 每个桶有规定的最大容量 W[i]。 求操作后两相邻桶之间的最大差值的平方的最小值。
Michael阿明
2021/02/19
3520
【算法专题】动态规划之路径问题
题目:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径?
YoungMLet
2024/03/01
2190
【算法专题】动态规划之路径问题
本周小结!(动态规划系列五)
动态规划:377. 组合总和 Ⅳ中给定一个由正整数组成且不存在重复数字的数组,找出和为给定目标正整数的组合的个数(顺序不同的序列被视作不同的组合)。
代码随想录
2021/02/26
6470
【代码随想录】二刷-贪心算法
贪心算法 什么是贪心? 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 贪心没有规定的套路。 刷题或面试的时候,手动模拟一下感觉可以局部最优退出整体最优,而且想不到反例,那么就试一试贪心。 贪心算法一般分为如下四步: 将问题分为若干子问题 找出合适的贪心策略 求解每一个子问题的最优解 将局部最优解堆叠成全局最优解 ---- 455. 分发饼干 方法1: 充分利用每个饼干的大小,用大块的饼干优先喂饱大胃口的孩子 class Solution { public:
半生瓜的blog
2023/05/13
4370
【代码随想录】二刷-贪心算法
LeetCode 435. 无重叠区间(贪心/动态规划)
注意: 可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。
Michael阿明
2020/07/13
1.1K0
算法训练之动态规划(三)
我们可以看到第一行就是它本身的值,而第一行是受到我们增加的那一行影响的,所以我们增加的那一行应该全部初始化为0,才不会出错~接下来看后面的两行,都是在取上一行三个位置的最小值加上当前位置值得到的,那么旁边的两列如果也初始化为0的话,那么边界找到的最小值就是0了,这并不是数组里面的有效数据~所以为了避免影响,我们也就可以把两列位置设置成INT_MAX,题目给出数据大小范围,显然dp[i][j]是不会超过INT_MAX的,那么我们就可以这样进行初始化~ 第一行初始化为0,剩下的位置初始化为INT_MAX
用户11352420
2025/04/11
700
算法训练之动态规划(三)
推荐阅读
相关推荐
【一天一大 lee】视频拼接 (难度:中等) - Day20201024
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验