原文:贪心算法之区间调度问题
贪心算法需要满足贪心选择性质:每一步都做出一个局部最优的选择,最终的结果就是全局最优。
比如你面前放着 100 张人民币,你只能拿十张,怎么才能拿最多的面额?显然每次选择剩下钞票中面值最大的一张,最后你的选择一定是最优的。、
区间调度问题(Interval Scheduling),给你很多形如 [start, end] 的闭区间,请你设计一个算法,算出这些区间中最多有几个互不相交的区间。
举个例子,intvs = [[1,3], [2,4], [3,6]],这些区间最多有 2 个区间互不相交,即 [[1,3], [3,6]],你的算法应该返回 2。注意边界相同并不算相交。
正确的思路其实很简单,可以分为以下三步:
把这个思路实现成算法的话,可以按每个区间的 end
数值升序排序,因为这样处理之后实现步骤 1 和步骤 2 都方便很多:
现在来实现算法,对于步骤 1,由于我们预先按照 end
排了序,所以选择 x 是很容易的。关键在于,如何去除与 x 相交的区间,选择下一轮循环的 x 呢?