总和大于或等于 k ​​的最小子集

Posted

技术标签:

【中文标题】总和大于或等于 k ​​的最小子集【英文标题】:Smallest subset with sum greater or equal to k 【发布时间】:2021-06-04 19:10:39 【问题描述】:

我试图找到一种分而治之的算法来解决 O(n) 中的这个问题,但我什么也没找到。 给定一个数组 A 和给定值 k。 找到。 有人可以给我一个开始解决问题的想法吗?

非常感谢任何帮助。

【问题讨论】:

***.com/questions/35436114/… @n.'pronouns'm。这个问题是针对子数组的,而这个问题是针对子集的。不同之处在于子数组必须是连续的,但子集不必是连续的。 @kaya3 这个问题措辞不当。从 cmets 中可以清楚地看出,作者指的是子集而不是子数组。所有答案也适用于一个子集。很明显,子数组问题有一个多项式时间的答案。子集问题是 NP-hard。 “最小”是指最小的和还是最小的基数? @n.'pronouns'm。最小基数 【参考方案1】:

对数组进行排序,然后从大到小选择元素,直到总和足够大。这种方法的时间复杂度将是 O(n log n)。

当期望找到一个小的子集时,可以通过使用快速排序算法来实现较低的平均时间复杂度,而不是对较低的分区进行排序,除非并且直到事实证明有必要这样做;当在较高的分区中找到一个和足够大的子集时,可以忽略较低的分区。如果子集的预期大小与 n 无关,那么这种方法的时间复杂度应该是 O(n)。

【讨论】:

【参考方案2】:

使用快速选择在预期的线性时间内完成此操作。

您的第一个快速选择会将数组分成两部分,一个包含较大的元素,另一个包含较小的元素。如果较大元素的总和 > k,则对其进行迭代。否则,以 k - sum(更大的元素)为目标对另一半进行迭代。

【讨论】:

但是快速排序的时间复杂度是O(nlogn) @narges 我们不需要快速排序,只需要快速选择。 @narges Quickselect 将获得我们想要的元素,但未排序。它只在枢轴的一侧递归。 en.wikipedia.org/wiki/Quickselect

以上是关于总和大于或等于 k ​​的最小子集的主要内容,如果未能解决你的问题,请参考以下文章

查找总和等于 k ​​的子集的数量

改进子集解决方案

698. 划分为k个相等的子集(Python)

划分为k个相等的子集

寻找子集组合以实现给定总和同时保持成本最小的算法

计算给出数组中最小标准差的子集