> 文章列表 > 1024. 视频拼接

1024. 视频拼接

1024. 视频拼接

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

使用数组 clips 描述所有的视频片段,其中 clips[i] = [starti, endi] 表示:某个视频片段开始于 starti 并于 endi 结束。

甚至可以对这些片段自由地再剪辑

  • 例如,片段 [0, 7] 可以剪切成 [0, 1] + [1, 3] + [3, 7] 三部分。

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

示例 1:

输入:clips = [[0,2],[4,6],[8,10],[1,9],[1,5],[5,9]], time = 10
输出:3
解释:
选中 [0,2], [8,10], [1,9] 这三个片段。
然后,按下面的方案重制比赛片段:
将 [1,9] 再剪辑为 [1,2] + [2,8] + [8,9] 。
现在手上的片段为 [0,2] + [2,8] + [8,10],而这些覆盖了整场比赛 [0, 10]。

示例 2:

输入:clips = [[0,1],[1,2]], time = 5
输出:-1
解释:
无法只用 [0,1] 和 [1,2] 覆盖 [0,5] 的整个过程。

示例 3:

输入:clips = [[0,1],[6,8],[0,2],[5,6],[0,4],[0,3],[6,7],[1,3],[4,7],[1,4],[2,5],[2,6],[3,4],[4,5],[5,7],[6,9]], time = 9
输出:3
解释: 
选取片段 [0,4], [4,7] 和 [6,9] 。

提示:

  • 1 <= clips.length <= 100
  • 0 <= starti <= endi <= 100
  • 1 <= time <= 100

 

//20230406 按start  end 正序排序

vector<vector<int>> sortVec2(vector<vector<int>>&clips)

{

  vector<vector<int>> tmpVec;

  tmpVec.push_back(clips[0]);

  for (int i = 1; i < clips.size(); i++)

  {

    int j = 0;

    for (; j < tmpVec.size(); j++)

    {

      if (clips[i][0]>tmpVec[j][0] )

      {

        continue;

      }

      else if (clips[i][0] == tmpVec[j][0])

      {

        if (clips[i][1]>tmpVec[j][1])

        {

          continue;

        }

        else

        {

          break;

        }

      }

      else

      {

        break;

      }

    }

    if (j == tmpVec.size())//没有找到

    {

      tmpVec.push_back(clips[i]);//插入到最后

    }

    else

    {

      tmpVec.insert(tmpVec.begin() + j, clips[i]);

    }

   

  }

  return tmpVec;

}

//20230413从起点开始,每次找最长的距离

int videoStitching(vector<vector<int>>& clips, int time)

{

  clips = sortVec2(clips);

  vector<vector<int>>ret;

  //ret.push_back(vector<int>{0,0});

  int cur = 0;

  int target = 0;

  while (cur < clips.size())

  {

    if (clips[cur][1]>clips[target][1] && clips[cur][0] ==0)

    {

      target = cur;

    }

    cur++;

  }

    if (clips[target][0] != 0)

  {

    return -1;

  }

  if (clips[target][1] >= time)

  {

    return 1;

  }

  ret.push_back(clips[target]);

  while (target < clips.size())

  {

    int findIndex = target;

    cur = target + 1;

    while (cur < clips.size())

    {

      if (clips[cur][0] <= clips[target][1] && clips[cur][1] > clips[findIndex][1])

      {

        findIndex = cur;

      }

      cur++;

    }

    if (findIndex == target)

    {

      return -1;

    }

    target = findIndex;

    if (clips[target][1] >= time)

    {

      return ret.size() + 1;

    }

    ret.push_back(clips[target]);

  }

  return -1;

}