挑选互不重叠的短片段时为什么先结束更有用:规则练习第05例
从一组时间片段中选择尽量多的片段时,最早开始或持续时间最短都未必给后续留下最合适的空间。一个明确的选择规则是优先考虑最早结束的片段。
所有片段都是左闭右开的区间,结束时刻等于下一段开始时刻可以相接。按结束时刻、开始时刻、编号排序,只有当前片段的开始不早于上一已选片段的结束才接受。
本例输入与约定
十二个片段的开始和结束时刻为[[20, 24], [19, 23], [17, 27], [3, 10], [3, 12], [23, 32], [8, 17], [16, 17], [6, 8], [23, 31], [20, 23], [0, 10]]。
完整计算记录
考虑编号 | 片段范围 | 上次接受段的终点(初始为-1) | 接受 8 | [6, 8] | -1 | True 11 | [0, 10] | 8 | False 3 | [3, 10] | 8 | False 4 | [3, 12] | 8 | False 6 | [8, 17] | 8 | True 7 | [16, 17] | 17 | False 1 | [19, 23] | 17 | True 10 | [20, 23] | 23 | False 0 | [20, 24] | 23 | False 2 | [17, 27] | 23 | False 9 | [23, 31] | 23 | True 5 | [23, 32] | 31 | False 最终接受4段,编号按播放顺序为[8, 6, 1, 9]。
表中编号仅用于识别本例的元素。读取一个结果时,应先核对它对应的输入、处理顺序和边界约定;布尔值表示条件是否成立,空集合表示没有符合要求的对象,不应把这些字段混成同一种数值。
复核方法与适用范围
本例目标是片段数量最多,不是总播放长度最长,也没有片段权重。对十二个片段可以穷举所有子集,核对是否存在更多个互不重叠的片段,独立验证贪心结果。
如果片段之间需要额外过渡时间,或某些片段必须一起出现,原来的选择规则就不再直接适用。选择数量相同的方案可能有多种,不能要求所有正确方案的编号完全相同。
练习时可以先独立计算最前面的一步,再检查最后的整体不变量。若结论不同,应保留各步记录,定位第一处差异;只调整最终数字会掩盖规则理解上的问题。改变输入后也要重新演算,而不是照抄这一例的输出。