未排序的数组填充有随机正整数。是什么 总数不超过容量C的元素的最大子集?
即:数组[1、5、3、6、3、2],其中C = 9 |答案:{1、2、3、3}约束:O(n)时间复杂度
提示:修剪和搜索以及QuickSelect
我已经花了很长时间思考如何解决这个问题,但是这种限制使这变得非常困难。我的假设是,数组不需要完全排序,因为提示建议将修剪和搜索与QuickSelect结合使用。快速选择可以很容易地在恒定时间内找到(使用median method),但是我不确定两者的结合将如何帮助找到答案。
答案 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固有的)