【LeetCode 1024】视频拼接 Video Stitching

题目:
在这里插入图片描述
题意为:用一个chips[][]数组来记录一些视频片段,chips[i][0]记录开始时间,chips[i][1]记录结束时间,给定一个最终要到达的时间点,求判断给定的视频片断,能否拼凑到要求的时间点,如果能到达,问最少需要多少个视频片段可以完成。
举例:
在这里插入图片描述
举例部分,例如第三个例子,里面的视频碎片中,选取[0,4]、[4,7]、[6,9]这三个片段,刚好可以到达时间点 9,因此需要的最少的碎片数为3。
这种题目,求最少需要多少,很容易想到贪心或者是动态规划,但明显这题目用贪心的当前最优的思想,没有办法达到最终的全局最优,因此选用动态规划的思路,那对于动态规划,主要就有两个问题:

  • 定义状态量
  • 状态转移方程

这题状态量也好确定,它要求最少的碎片数,我们可以用 dp[]来记录到达每个时间点时需要的最少碎片数,则我们可以在dp[T + 1]的地方找到题目的答案。
第二个问题是状态转移方程,我们可以将碎片分为两类,第一类是从 0开始的碎片,对于这些碎片范围内的时间点,都有dp[i] = 1即一个碎片就可以到达,对于第二类碎片,即不是从 0开始的,例如[6,9],我们需要更新dp[6]dp[9]的值,当前到达 6到 9之间的最少碎片数,为:Math.min(dp[i], dp[start] + 1),我们这里要注意,有一些并不能完整的拼接到我们要的时间点,可能有[0,4],[5,6],这种是不行的。我采取的方法是:在一开始根据他们的起点进行排序,当遍历到新的一个起点非0的点i时,如果dp[i] == 0,即在此之前所有的视频段都不能覆盖到第 i个时间点,则这些碎片不能成段,直接返回 -1。

代码:

	public int videoStitching(int[][] clips, int T) {
   
        // 状态量,用于记录到达对应时间点所需的最少碎片数
        int[] dp 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值