给定一个数字数组arr和数字S,找到4个不同的数字 总结为S的arr。
编写一个获取arr和S的函数并返回一个包含4的数组 这些数字的索引在arr。
我提出的解决方案涉及递归建立索引组合,同时确保不会多次计算任何组合。我还通过确保解决方案集的大小不超过4来修剪搜索树。
bits
如何确定此算法的运行时间?我觉得它像是O(n选择4),但我不确定。解决方案告诉我最佳运行时间是O(n ^ 2)。
答案 0 :(得分:2)
你的解决方案确实是O(nC4) = O(n^4)
,因为它找到所有可能的组合并将其检出 - 对于每种组合,都会有额外的工作需要。
可以在O(n^2)
中通过首先填充哈希映射(std::unordered_map
)来完成,其中键是数组中所有对的总和,并且值指向这些值的索引。
填充此地图的平均值为O(n^2)
。
然后,再次迭代所有对,并且对于每个i,j
对d
,在哈希映射中查找是否存在带有键S - d
的条目。
警告:您还需要确保此条目不包含i,j
的索引。为了能够处理它,你的地图值实际上可能是成对的矢量。
作为旁注,这个问题被称为subset-sum problem,放松了4个元素与目标的总和(经典问题没有限制)