Algorithm 开发算法以获得覆盖范围从1到n所需的最小子范围数
有人能用一些伪代码和/或解释如何着手解决这个问题来帮助我解决这个问题吗 您将获得一个范围列表{start,stop}和目标长度n。某些范围将与其他范围重叠。开发一种算法,确定从1到n完全跨越所需的最小范围数 例如,如果给我一个范围列表[{1,2},{1,3},{2,3}],目标长度n=3,我应该返回1,因为我们只需要{1,3}就可以覆盖1到3。显然,这是一个非常简单的测试用例 有什么想法吗?我被难住了。我几乎想开发某种贪婪的算法,但我不确定这是否适合贪婪的解决方案…您可以使用。将间隔放入数据结构中 从a=1开始 在每个步骤中,查询树以查找与a重叠且右端最大的间隔。注意,当您将间隔树实现为一个扩展的红黑树时,您可以使查询同时满足这两个条件 将a的值重置为该右端的值 在查询返回结果时重复此操作,每次将结果间隔存储在将成为答案的列表中。当a>=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。显然,这是一个非常简单的测试用例 有什么想法吗?我被难住了。我几乎想开发某种贪婪的算法,但我不确定这是否适合贪婪的解决方案…您可以使用。将间隔放入数据结构
证明上述结果具有最小基数 假设上面得到的间隔序列(按其左端排序)是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
到目前为止,我想我应该从按开始元素对范围列表进行排序开始,但我不确定下一步该去哪里 是的,这是一个好的开始 完成后,您将在“可访问”范围的“块”中迭代:
- 首先,你要扫描所有从哪里开始的范围≤1(意味着它们可以立即“到达”),并在这些范围中找到最大的端点-称之为max_end1
- 然后,用1扫描所有范围
到目前为止,我想我应该从按开始元素对范围列表进行排序开始,但我不确定下一步该去哪里 是的,这是一个好的开始 完成后,您将在“可访问”范围的“块”中迭代:- 首先,你要扫描所有从哪里开始的范围≤1(意味着它们可以立即“到达”),并在这些范围中找到最大的端点-称之为max_end1
- 然后,你现在用1扫描所有范围,我想我应该从按开始元素对范围列表进行排序开始,但我不确定下一步要去哪里…让我们讨论覆盖目标间隔
,而不仅仅是[a,b]
。您有几个包含[1,n]
的间隔。你需要一个吗?不止一个?哪一个?一旦你做出了选择,你现在需要解决什么样的问题?到目前为止,我想我应该从按开始元素对范围列表进行排序开始,但我不确定下一步要去哪里…让我们讨论一下覆盖目标间隔a
,而不仅仅是[a,b]
。您有几个包含[1,n]
的间隔。你需要一个吗?不止一个?哪一个?一旦你做出了选择,你现在需要解决什么样的问题?这是如何给你一个最小值的可能的重复?这是如何给你一个最小值的?好的,我想我在跟进。然而,我对如何使用两个嵌套循环来实现它感到困惑。你重复“块”是什么意思?当你说一个chunk时,你是说from 1a