容量内数组中元素的最大子集

时间:2018-11-14 04:38:36

标签: algorithm

  

未排序的数组填充有随机正整数。是什么   总数不超过容量C的元素的最大子集?
  即:数组[1、5、3、6、3、2],其中C = 9 |答案:{1、2、3、3}

     

约束:O(n)时间复杂度
  提示:修剪和搜索以及QuickSelect

我已经花了很长时间思考如何解决这个问题,但是这种限制使这变得非常困难。我的假设是,数组不需要完全排序,因为提示建议将修剪和搜索与QuickSelect结合使用。快速选择可以很容易地在恒定时间内找到(使用median method),但是我不确定两者的结合将如何帮助找到答案。

1 个答案:

答案 0 :(得分:3)

问题假设您需要分离较小的元素,直到它们的总和达到C

选择枢轴(任何方法)。
相对于数据透视进行分区。
计算左侧部分的总和。
如果太小(Sum < C),请递归地解决正确部分和值 C'=C-Sum的相同问题
如果Sum过大Sum > C,请为左侧部分解决相同的问题。

这是对QuickSelect

的修改

对于良好的分区方案,您将需要进行约n + n/2 + n/4 + n/8... +1 = 2*n = O(n)个求和操作(加上分区成本,这是Quickselect固有的)