Algorithm 开发算法以获得覆盖范围从1到n所需的最小子范围数

Algorithm 开发算法以获得覆盖范围从1到n所需的最小子范围数,algorithm,range,intervals,minimum,greedy,Algorithm,Range,Intervals,Minimum,Greedy,有人能用一些伪代码和/或解释如何着手解决这个问题来帮助我解决这个问题吗 您将获得一个范围列表{start,stop}和目标长度n。某些范围将与其他范围重叠。开发一种算法,确定从1到n完全跨越所需的最小范围数 例如,如果给我一个范围列表[{1,2},{1,3},{2,3}],目标长度n=3,我应该返回1,因为我们只需要{1,3}就可以覆盖1到3。显然,这是一个非常简单的测试用例 有什么想法吗?我被难住了。我几乎想开发某种贪婪的算法,但我不确定这是否适合贪婪的解决方案…您可以使用。将间隔放入数据结构

有人能用一些伪代码和/或解释如何着手解决这个问题来帮助我解决这个问题吗

您将获得一个范围列表{start,stop}和目标长度n。某些范围将与其他范围重叠。开发一种算法,确定从1到n完全跨越所需的最小范围数

例如,如果给我一个范围列表[{1,2},{1,3},{2,3}],目标长度n=3,我应该返回1,因为我们只需要{1,3}就可以覆盖1到3。显然,这是一个非常简单的测试用例

有什么想法吗?我被难住了。我几乎想开发某种贪婪的算法,但我不确定这是否适合贪婪的解决方案…

您可以使用。将间隔放入数据结构中

从a=1开始

在每个步骤中,查询树以查找与a重叠且右端最大的间隔。注意,当您将间隔树实现为一个扩展的红黑树时,您可以使查询同时满足这两个条件

将a的值重置为该右端的值

在查询返回结果时重复此操作,每次将结果间隔存储在将成为答案的列表中。当a>=n时停止

返回获得的列表


证明上述结果具有最小基数

假设上面得到的间隔序列(按其左端排序)是I1、I2、…、Im,并调用a1、a2、…、am,它们的右端

如果J1、J2、…、Jr是另一个间隔序列,按其左端以r最小值覆盖[1,n]排列。呼叫b1,b2,…,br他们的右端

注意,J1包括1。因此b1您可以使用。将间隔放入数据结构中

从a=1开始

在每个步骤中,查询树以查找与a重叠且右端最大的间隔。注意,当您将间隔树实现为一个扩展的红黑树时,您可以使查询同时满足这两个条件

将a的值重置为该右端的值

在查询返回结果时重复此操作,每次将结果间隔存储在将成为答案的列表中。当a>=n时停止

返回获得的列表


证明上述结果具有最小基数

假设上面得到的间隔序列(按其左端排序)是I1、I2、…、Im,并调用a1、a2、…、am,它们的右端

如果J1、J2、…、Jr是另一个间隔序列,按其左端以r最小值覆盖[1,n]排列。呼叫b1,b2,…,br他们的右端

注意,J1包括1。因此b1
到目前为止,我想我应该从按开始元素对范围列表进行排序开始,但我不确定下一步该去哪里

是的,这是一个好的开始

完成后,您将在“可访问”范围的“块”中迭代: