【问题标题】:How to pick a max number of items in a sequence that needs to have k items between them?如何在需要在它们之间有 k 个项目的序列中选择最大数量的项目?
【发布时间】:2015-06-25 17:03:40
【问题描述】:

我正在研究算法,我通常会偶然发现这类问题。好的,我有一个数字列表,我必须找到这个列表的最大子列表,其中每个数字之间的距离等于或大于列表的大小。例如:

[1, 3, 5, 10]

本例中的距离为 4。那么,[1, 5, 10] 将是正确答案。请记住,当我删除数字 3 时,距离现在是 3。

欢迎任何直觉,我什至不知道如何解决这个问题。我尝试为每个号码生成可能的路径,例如[1,5,9,13],但我想不出一种方法来选择要删除的号码。这类问题据说可以在 O(N) 内解决。

【问题讨论】:

  • 最初是列表排序吗?
  • 在 [1, 3, 7, 11] 的情况下 .... 解决方案 [1, 7, 11] 或 [3, 7, 11] 或两者或任何一个?跨度>
  • 您想找到任何这样的列表(在这种情况下,简单的答案是取空列表)还是最佳列表?在后一种情况下,您希望优化什么?
  • @FUZxxl 对不起。我编辑它。它必须是最大子列表,即在[3,10] 不能作为答案的情况下。
  • @JoseRicardoBustosM。两者都可以。

标签: algorithm language-agnostic


【解决方案1】:

以下算法是O(N),我认为可以解决问题,我正在尝试不同的测试用例

read(a)
N <- len(a)
solution <- []
if a[N-1]-a[0] < N then
  return solution
else
  last = a[0]
  solution.push(a[0])
  for i = 1 to N-1
    if a[i]-last >= N then
      solution.push(a[i])
      last = a[i]
    end if
  end for
  return solution
end if

【讨论】:

    【解决方案2】:

    解决方法很简单。

    1. 首先计算初始列表[1, 3, 5, 10] -> [2, ,2 , 5] 中连续数字之间的所有距离并记住长度。这是 O(n) 操作。
    2. 请注意,然后您从初始列表中删除数字,您只需将距离列表中的 2 个值相加,并将列表的长度减一。 s 这个观察导致了第二个贪婪的 O(n) 过程。您只需通过距离列表并将它们与列表的当前长度进行比较。如果距离 >= 长度,则转到下一个元素。如果距离小于长度,则删除此元素(合并两个距离)并将长度减一并再次检查...

    在每一步之后,您之前的所有距离 > 长度 > 新减少的长度。在程序结束时,您会得到您想要的。

    【讨论】:

    • 如果您删除列表末尾的数字会发生什么。列表长度现在减少,创建新的候选编号以供删除。你会再次迭代差异吗?如果是,那么您的算法在 O(N^2) 时间内运行,而不是线性运行。
    • @NikunjBanka 如果我删除列表末尾的数字,我会完成算法,因为即使当前距离
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 2020-02-09
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 2022-01-15
    相关资源
    最近更新 更多