LeetCode1024(DP)

LeetCode1024(DP)

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

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

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

思路: 和做过的最大跳数很像,看看能不能转换成同种类型

clips = [[0,2],[4,6],[8,10],[1,9],[1,5],[5,9]], T = 10

转化int[T + 1]数组 int = [2,8,0,3,2,5,0,0,2,0,0],

if (clips[i][1] - clips[i][0] > ints[clips[i][0]]){//二维数组转一维数组
    ints[clips[i][0]] = clips[i][1] - clips[i][0];
}

这样就和最大跳数的那题很像了(贪心,DP都可以去做,貌似贪心更简单)

Java代码:

public static int videoStitching(int[][] clips, int T) {
    int[] ints = new int[T + 1];
    int[] dp = new int[T + 1];
    for (int i = 0; i < clips.length; i++){
        if (clips[i][0] >= T){//clips[i][0]:下标大于T
            continue;
        }
        if (clips[i][1] - clips[i][0] > ints[clips[i][0]]){//二维数组转一维数组
            ints[clips[i][0]] = clips[i][1] - clips[i][0];
        }
    }
    for (int i = 0; i < T + 1; i++){
        dp[i] = -1;//初始化
        dp[0]  = 0;
        for (int j = 0; j < i; j++){
            if (j + ints[j] >= i && dp[i - 1] >= 0){
                dp[i] = dp[j] + 1;//转移方程
                break;
            }
        }
    }
    return dp[T];
}

Github地址:https://github.com/Randy777/Study/tree/master/src/dP

你可能感兴趣的:(算法)