在这些条件下,是否有可能比O(n ^ 2)更好地进行3-sum / 4-sum ... k-sum? - 技术访谈

时间:2017-09-10 18:44:33

标签: arrays algorithm

这是一个经典问题,但我很好奇是否可以在这些条件下做得更好。

问题:假设我们有一个长度为4 * N的排序数组,也就是说,每个元素重复4次。注意,N可以是任何自然数。此外,阵列中的每个元素都受约束0< A [i]< 190 * N。阵列中是否有4个元素,使得A [i] + A [j] + A [k] + A [m] = V,其中V可以是任何正整数;请注意,我们必须使用4个元素才能重复。找到满足条件的4个元素并不一定要求,而只是表明它可以用于给定的数组并且V就足够了。

Ex:A = [1,1,1,1,4,4,4,4,5,5,5,5,11,11,11,11] V = 22

这是真的,因为11 + 5 + 5 + 1 = 22.

我的尝试:

而不是“4sum”我首先尝试了k-sum,但事实证明这非常困难,所以我反而尝试了这种变化。我来的第一个解决方案是相当天真的O(n ^ 2)。但是,考虑到这些限制,我想我们可以做得更好。我尝试了一些动态编程方法并分而治之,但这并没有让我感到满意。具体来说,我不确定如何巧妙地处理这个问题,我可以“消除”数组的部分,而不必明确地检查所有或几乎所有排列的值。

1 个答案:

答案 0 :(得分:2)

  1. 制作长 256N 的向量 S0 ,其中 S0 [x] = 1 如果 x 出现在强> A 即可。
  2. 对自身执行 S0 的卷积,以生成长度 512N 的新向量 S1 S1 [x] 非零,如果 x A 中2个数字的总和。
  3. 对自己执行 S1 的卷积,以生成新的向量 S2 S2 [x] 非零,如果 x A 中4个数字的总和。
  4. 检查 S2 [V] 以获得答案。
  5. 可以使用FFT卷积(http://www.dspguide.com/ch18/2.htm)或类似技术在 O(N log N)时间内执行卷积。

    由于最多执行4次此类卷积,因此总复杂度 O(N log N)