【发布时间】:2012-10-12 22:57:47
【问题描述】:
给定一个数组(假设为非负整数),我们需要找到最小长度的子集,使得元素的总和不小于 K。K 是另一个作为输入提供的整数。
是否有可能有一个时间复杂度为 O(n) [big oh of n] 的解决方案?
我目前的想法是这样的: 我们可以在 O(n * log n) 中对数组进行排序,然后从最大数开始迭代排序后的数组并保持运行总和,直到运行总和变为 >= K。
但是,这将具有 O(n * (log n + 1)) 的最坏情况运行时间。
因此,如果有人能在 O(n) 时间内分享这样做的想法,我将不胜感激..
注意:子数组的元素在此上下文中不必是原始数组的连续序列
【问题讨论】:
-
排序不会弄乱元素的顺序吗?子数组是什么意思?数组中元素的连续序列,还是数组中元素的子集?
-
在这种情况下不能应用排序,因为它会改变项目的顺序。
-
我假设顺序并不重要。即 {1,2,3} 和 {2,1,3} 被视为相同的子数组。 Subrarray 指的是元素的子集,在这种情况下不一定是连续的序列。
-
另外,如果您认为排序不是可行的方法,您会建议使用什么算法来解决这个问题?
-
正如我在下面对答案的评论中所说,这是一个非常具有误导性的问题。请将标题更改为“总和不小于 key 的最小子集”或类似名称,并将正文中的所有引用从“子数组”更改为“子集”,从“长度”更改为“大小”,以明确该元素顺序和连续性并不重要。然后我将删除 -1。