确定大O:在数组中找出4个不同的数字,总计为S.

时间:2016-07-30 17:53:58

标签: arrays algorithm c++11

  

给定一个数字数组arr和数字S,找到4个不同的数字   总结为S的arr。

     

编写一个获取arr和S的函数并返回一个包含4的数组   这些数字的索引在arr。

我提出的解决方案涉及递归建立索引组合,同时确保不会多次计算任何组合。我还通过确保解决方案集的大小不超过4来修剪搜索树。

bits

如何确定此算法的运行时间?我觉得它像是O(n选择4),但我不确定。解决方案告诉我最佳运行时间是O(n ^ 2)。

1 个答案:

答案 0 :(得分:2)

你的解决方案确实是O(nC4) = O(n^4),因为它找到所有可能的组合并将其检出 - 对于每种组合,都会有额外的工作需要。

可以在O(n^2)中通过首先填充哈希映射(std::unordered_map)来完成,其中键是数组中所有对的总和,并且值指向这些值的索引。 填充此地图的平均值为O(n^2)

然后,再次迭代所有对,并且对于每个i,jd,在哈希映射中查找是否存在带有键S - d的条目。

警告:您还需要确保此条目不包含i,j的索引。为了能够处理它,你的地图值实际上可能是成对的矢量。

作为旁注,这个问题被称为subset-sum problem,放松了4个元素与目标的总和(经典问题没有限制)