【问题标题】:Unique set sums from a list列表中的唯一集合总和
【发布时间】:2014-03-24 19:15:55
【问题描述】:

我正在做一些算法练习并遇到了这个。

我有一个列表/数组,如下所示:[1, 5, 4, 9, 10, 2, ...]

我将如何返回找到具有相同总和的列表的唯一集?例如,(5, 4) 等于 (9),(1, 5) 等于 6,以此类推。

我熟悉查找列表的所有集合,但增加的技巧是集合必须是唯一的,因为如果一个索引用于一组,相同的索引不能用于另一组.

有什么想法吗?谢谢。

编辑:

在考虑了更多之后,这就是我所拥有的。我列出了所有可能的集合,而不是担心唯一性。然后我得到原始超集数组的最小值和最大值。我循环遍历从最小值到最大值的值,递增 1 并检查每一组。创建一个哈希图。如果集合的总和等于我们正在检查的值,我们将该集合添加到列表中。此外,如果集合的索引值具有键,我们将哈希图中的值关联键设置为 True。继续使用 hashmap 条件检查每个集合。然后我们返回应该只有唯一集合的列表列表。

有意义吗?

【问题讨论】:

  • 我认为你的意思不是独一无二,而是disjoint。我希望1+5 = 6,而不是 5。
  • 我认为这没有正确定义 - 你想返回任何不相交集的集合吗?还是最大/最小的?无论如何,您的解决方案在时间和空间上都是指数级的,所以我很确定它可以做得更好..
  • 任何不相交集的集合。是的,第一次破解是指数级的,试图让它下来。编辑:相反,单个总和加上递归调用是 O(n) 。如果我循环遍历整个范围,它就会变成指数级。
  • I make a list of all possible sets - 仅此一项就时间和内存的定义而言是指数级的。

标签: arrays algorithm list set unique


【解决方案1】:

make a list of all possible sets - 这当然是时间和空间上的指数。这是一个多项式时间解决方案(如果我理解这个问题):

  1. 遍历列表,保留两个指针 - 每次第一个指针递增时,第二个指针从该索引 +1 运行到列表末尾。
  2. 对于两个元素的每个组合,如果它们的总和低于所需的总和,则将它们的组合值推到列表的末尾(保留组成它的原始索引)。
  3. 一旦找到与总和完全相等的元素组合,相应索引中的所有元素都将从列表中移除,并将该集合插入到不相交集合的解向量中。

在这个迭代过程结束时,您将拥有一组完整的不相交的集合 - 不一定是元素数量最多或组数量最多的集合,而是无法从剩余元素创建其他集合的集合在列表中。

【讨论】:

  • #2 是否删除了原始索引?如果不是,你如何防止它多次组合在同一个元素中?例如如果您有 1,2,4,5,则组合 1+2 -> 1,2,4,5,3,(最终)组合 2+3(重复 2 个)。我认为您需要举例说明。
  • @Dukeling #2 不会删除原始索引,而是将一个包含值及其原始索引列表的结构推入数组中,以在构造回最终集时使用,并确保如您的示例中那样重复一个数字。如果包含 atruct 的组合恰好等于总和,则包含该结构的所有元素也将被删除。就是这个想法。。等我有时间再写一个例子。
猜你喜欢
  • 1970-01-01
  • 2014-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-01
  • 2019-09-14
相关资源
最近更新 更多