按起点排序区间
处理事件前先排序
按起点排序区间 是 CoddyKit 上的免费 Competitive Programming Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Competitive Programming Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Competitive Programming Academy 课程共包含 4 节课。
什么是区间
区间就是一对数字,分别表示起点和终点,例如 [2, 5]。大多数区间问题处理的都是由这些数对组成的列表。📏
排序带来条理
原始区间可能以任意顺序出现,这使得问题难以分析。先对区间进行排序,就能将混乱的数据变成从左到右的清晰扫描。
按起点排序
默认做法是按起点值排序。这样每个区间的起点都不早于前一个区间,您只需向前扫描一次。
intervals.sort(key=lambda x: x[0])元组会自然排序
如果将区间存储为元组,Python 会先按第一个元素排序,再按第二个元素排序,无需额外操作。这里甚至不需要键函数。
intervals = [(3, 7), (1, 4), (2, 5)]
intervals.sort()为什么先按起点排序
按起点排序可以让您按照时间顺序处理事件。下一个区间只能在更晚的时间开始,这是扫描时的关键不变量。
起点相同时
当两个区间的起点相同时,次级键会决定它们的顺序。按(起点,终点)排序会让较短的区间排在前面,这通常很有帮助。
intervals.sort(key=lambda x: (x[0], x[1]))有时按终点排序
有些问题,例如安排尽可能多的事件,会改为按终点排序。请选择与扫描过程需要了解的信息相匹配的键。
intervals.sort(key=lambda x: x[1])排序的开销
排序需要 O(n log n) 的时间,这个开销很小,并且通常会成为这类问题的主要开销。之后的扫描只需要 O(n) 时间。
保留附加数据
如果每个区间还带有编号或权重,请对整个记录排序,而不只是对边界排序。排序键控制顺序,其他数据则会随之移动。
intervals.sort(key=lambda iv: iv[0]) # iv = (start, end, id)先排序,再扫描
几乎所有区间算法都遵循先 sort,再扫描。只要顺序正确,合并、计数和调度就会变成简单的循环。
一个简单的心智模型
可以把区间想象成参加聚会的客人。按起点排序会按照到达时间将他们排好队,这样您就能逐个接待。
快速检查
您即将合并一个区间列表。
回顾
区间是一个起点-终点数对,按起点排序可以将杂乱的列表变成清晰的扫描顺序。先排序,再向前处理,扫描复杂度为 O(n)。🚀
常见问题解答
「按起点排序区间」课时是免费的吗?
是的 — 「按起点排序区间」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Competitive Programming Academy 课程的其余内容,请升级到 CoddyKit PRO。 Competitive Programming Academy 课程共包含 4 节课。
「按起点排序区间」这节课中我会学到什么?
处理事件前先排序 你通过在浏览器中直接运行的动手代码来练习 Competitive Programming Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Competitive Programming Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Competitive Programming Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「按起点排序区间」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Competitive Programming Academy 课中编写并运行代码吗?
能。每节 Competitive Programming Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。