解法一:动态规划
先按起始位置升序排列,状态初始化后遍历视频片段进行状态转移。
import java.util.Arrays;import java.util.Comparator;class Solution {private final static int MAX = 1000;public int videoStitching(int[][] clips, int T) {// dp[i]表示拼接出[0, i]这个片段所需要的最小视频数int[] dp = new int[101];// 先按起始位置升序排列Arrays.fill(dp, MAX);Arrays.sort(clips, new Comparator<int[]>() {@Overridepublic int compare(int[] o1, int[] o2) {return o1[0] - o2[0];}});if (clips[0][0] > 0) {return -1;}// 状态初始化int i = 0;while (clips[i][0] == 0) {for (int j = clips[i][0]; j <= clips[i][1]; ++j) {dp[j] = 1;}++i;}// 状态转移for (; i < clips.length; ++i) {for (int j = clips[i][0]; j <= clips[i][1]; ++j) {dp[j] = Math.min(dp[j], dp[clips[i][0]] + 1);}}// 根据是否有解输出答案if (dp[T] != MAX) {return dp[T];} else {return -1;}}}
