【问题标题】:Covering all the numbers with the given intervals用给定的间隔覆盖所有数字
【发布时间】:2014-10-28 09:16:39
【问题描述】:

这是算法大师的问题:-)

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]}

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

谢谢!

【问题讨论】:

标签: algorithm language-agnostic set intervals


【解决方案1】:

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

按顺序考虑 N 中的点。

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

否则,请考虑包含该点的区间。在这些间隔中,选择一个覆盖最多未发现点的间隔。 (这将是终点最高的区间。)

示例

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-30
    • 2017-07-20
    • 1970-01-01
    • 2013-09-18
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多