algorithm - 用给定的间隔覆盖所有数字

标签 algorithm language-agnostic set intervals

这是算法专家的问题:-)

S 是一组可能重叠的自然数区间,N 是一个数字列表。

我想找到 S 的最小子集(我们称之为 P),这样对于每个数字 在我们的列表 N 中,P 中至少存在一个包含它的区间。 P 中的区间允许重叠。

简单的例子:

S = {[1..4], [2..7], [3..5], [8..15], [9..13]}
N = [1, 4, 5]
// so P = {[1..4], [2..7]}

我认为动态算法可能并不总是有效,所以如果有人知道这个问题的解决方案(或可以转换成的类似解决方案),那就太好了。

谢谢!

最佳答案

您可以使用贪心算法来做到这一点。

按顺序考虑 N 中的点。

对于每个点,如果它已经被一个区间覆盖则跳过它。

否则,考虑包含该点的区间。从这些间隔中,选择覆盖最多未覆盖点的间隔。 (这将是具有最高终点的区间。)

示例

  1. 第一个点是 1,仅被 1..4 覆盖,因此将此间隔添加到我们的集合中。
  2. 下一点是 4,但它已经涵盖了所以继续。
  3. 下一点是 5,由 2..7 和 3..5 涵盖。选择其中任何一个来获得包含 2 套所有要点的答案。

关于algorithm - 用给定的间隔覆盖所有数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26604562/

相关文章:

algorithm - 是否有解决 `size` 或 `height` 的二叉树问题的技巧?

algorithm - 快速平均平方差函数

language-agnostic - 如何开始使用语音转文本?

Python Pandas 根据另一个集合(集合)的成员资格选择行

algorithm - 查找具有高交集的集合的最快算法

c++ - 就地共轭整数分区

algorithm - 国家/州/海洋的地理区域数据

language-agnostic - 截取笔记本电脑上的 Fn 键

language-agnostic - 您是否遇到过三层间接寻址的任何原因?

c# - C# 中的 getter 和 setter 有什么用?我如何将它们与数组一起使用?