1024. 视频拼接

1.题目

视频拼接 - 力扣(LeetCode) https://leetcode-cn.com/problems/video-stitching/

2.题解

首先,先准备一个dp数组,给后面存放状态使用。之后给clips数组进行排序,return o1-o2;代表交换位置。然后遍历这个视频碎片数组,排除不符合要求的情况。对于目标碎片,则分为两类,分别是以0开始的碎片段和其他碎片段两类。分别计算出对于dp数组中储存的值。
如果拼接成功,dp[T]的值就是目标结果,不成功则输出-1。

3.代码

//视频拼接的逻辑
    class Solution {
        public int videoStitching(int[][] clips, int T) {
        
            // 状态量,用于记录到达对应时间点所需的最少碎片数
            int[] dp = new int[T + 1];
            // 根据视频碎片的起点来排序
            Arrays.sort(clips, new Comparator() {
                @Override
                public int compare(int[] o1, int[] o2) {
                    return o1[0] - o2[0];
                }
            });
            // 遍历所有视频碎片
            for (int[] k : clips) {
                // 当视频碎片不在我们要的时间范围内时,直接跳过
                if (k[0] >= dp.length){
                     continue;
                }
                // 视频碎片没有办法连续,直接跳出返回 -1
                if (k[0] != 0 && dp[k[0]] == 0){
                     return -1;
                }
                // 当视频碎片的末端超过我们要求的时间,进行裁剪
                if (k[1] >= dp.length){
                    k[1] = dp.length - 1; 
                }
                // 将视频碎片分为两类
                if (k[0] == 0) {
                    // 从 0开始的,直接范围内的时间都置为 1个碎片可达
                    for (int i = k[0]; i <= k[1]; i++) {
                        dp[i] = 1;
                    }
                } else {
                    // 其他碎片段,判断新的碎片能否带来更少的所需碎片
                    int temp = dp[k[0]] + 1;
                    for (int i = k[0]; i <= k[1]; i++) {
                        if (dp[i] == 0 || dp[i] > temp) {
                            dp[i] = temp;
                        }
                    }
                    
                }
            }
            // dp[T]为 0意味着未能到达 T点,因此未能拼接成功
            return dp[T] == 0? -1: dp[T];
            
        }
    }

4.执行结果

image.png

你可能感兴趣的:(1024. 视频拼接)