解法一:动态规划

先按起始位置升序排列,状态初始化后遍历视频片段进行状态转移。

  1. import java.util.Arrays;
  2. import java.util.Comparator;
  3. class Solution {
  4. private final static int MAX = 1000;
  5. public int videoStitching(int[][] clips, int T) {
  6. // dp[i]表示拼接出[0, i]这个片段所需要的最小视频数
  7. int[] dp = new int[101];
  8. // 先按起始位置升序排列
  9. Arrays.fill(dp, MAX);
  10. Arrays.sort(clips, new Comparator<int[]>() {
  11. @Override
  12. public int compare(int[] o1, int[] o2) {
  13. return o1[0] - o2[0];
  14. }
  15. });
  16. if (clips[0][0] > 0) {
  17. return -1;
  18. }
  19. // 状态初始化
  20. int i = 0;
  21. while (clips[i][0] == 0) {
  22. for (int j = clips[i][0]; j <= clips[i][1]; ++j) {
  23. dp[j] = 1;
  24. }
  25. ++i;
  26. }
  27. // 状态转移
  28. for (; i < clips.length; ++i) {
  29. for (int j = clips[i][0]; j <= clips[i][1]; ++j) {
  30. dp[j] = Math.min(dp[j], dp[clips[i][0]] + 1);
  31. }
  32. }
  33. // 根据是否有解输出答案
  34. if (dp[T] != MAX) {
  35. return dp[T];
  36. } else {
  37. return -1;
  38. }
  39. }
  40. }