1、题目描述
https://leetcode-cn.com/problems/video-stitching/
你将会获得一系列视频片段,这些片段来自于一项持续时长为 T 秒的体育赛事。这些片段可能有所重叠,也可能长度不一。
视频片段 clips[i] 都用区间进行表示:开始于 clips[i][0] 并于 clips[i][1] 结束。我们甚至可以对这些片段自由地再剪辑,例如片段 [0, 7] 可以剪切成 [0, 1] + [1, 3] + [3, 7] 三部分。
我们需要将这些片段进行再剪辑,并将剪辑后的内容拼接成覆盖整个运动过程的片段([0, T])。返回所需片段的最小数目,如果无法完成该任务,则返回 -1 。
1 <= clips.length <= 100
0 <= clips[i][0] <= clips[i][1] <= 100
0 <= T <= 100
2、代码详解
类似55. 跳跃游戏 https://blog.csdn.net/IOT_victor/article/details/106336199
贪心法代码
class Solution(object):
def videoStitching(self, clips, T):
"""
:type clips: List[List[int]]
:type T: int
:rtype: int
"""
# 贪心:跳跃游戏
maxn = [0] * T # 每一个位置 i,记录以其为左端点的子区间中最远的右端点
last = count = pre = 0
for begin, end in clips:
if begin < T:
maxn[begin] = max(maxn[begin], end)
# 枚举每一个位置,假设当枚举到位置 i 时,
# 记左端点不大于 i 的所有子区间的最远右端点为last。
# 这样last就代表了当前能覆盖到的最远的右端点。
for i in range(T):
last = max(last, maxn[i])
if i == last: # 如果更新后 last==i,那么说明下一个位置无法被覆盖,我们无法完成目标。
return -1
# 记录上一个被使用的子区间的结束位置为 pre,
# 每次越过一个被使用的子区间,就说明要启用一个新子区间,
# 这个新子区间的结束位置即为当前的 last。
# 每次遇到 i==pre,则说明用完了一个被使用的子区间。
# 这种情况下让答案加 1,并更新 pre 即可。
if i == pre:
count += 1
pre = last
return count
clips = [[0,2],[4,6],[8,10],[1,9],[1,5],[5,9]]
T = 10
s = Solution()
print(s.videoStitching(clips, T))
https://leetcode-cn.com/problems/video-stitching/solution/shi-pin-pin-jie-by-leetcode-solution/