我有一个整数数组,我需要找到这个数组的子集,其中最多3个元素等于W。
我能用背包解决这个问题吗?或者我需要计算每个1-2-3元素组合的数组?
非常感谢
答案 0 :(得分:1)
要查找总和为W
的3个元素,这正是the 3SUM problem。
可以通过以下任一方式在O(n 2 )时间内解决:
将每个数字插入哈希表,然后,对于两个数字a
和b
的每个组合,检查哈希表中是否存在W-a-b
。
然后,为每个元素a
排序数组,使用来自任意一方的2个迭代器,查找两个总和为W-a
的元素。
如果整数范围在[-u, u]
范围内,则可以使用O(n + u log u)中的快速傅里叶变换解决问题。有关此方法或上述方法之一的详细信息,请参阅上述链接。
由于您的问题依赖于解决3SUM问题,这是一个众所周知的问题,因此您不太可能找到比上述3SUM众所周知的解决方案更好的运行时间的解决方案。
要查找1个元素:
您可以进行简单的线性搜索(O(n))。
寻找2个元素:
这可以通过简单地检查O(n 2 )中的2个元素的每个组合来解决(你不需要做一些更复杂的事情,因为3个元素的渐近运行时间将导致O( n 2 )总时间,无论其效率如何)。
也可以使用与上述3SUM相同的方法在O(n)或O(n log n)中求解。
总体运行时间:
O(n 2 )或O(n + u log u),取决于使用哪种方法来解决3SUM部分。