这是一个经典问题,但我很好奇是否可以在这些条件下做得更好。
问题:假设我们有一个长度为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)。但是,考虑到这些限制,我想我们可以做得更好。我尝试了一些动态编程方法并分而治之,但这并没有让我感到满意。具体来说,我不确定如何巧妙地处理这个问题,我可以“消除”数组的部分,而不必明确地检查所有或几乎所有排列的值。
答案 0 :(得分:2)
可以使用FFT卷积(http://www.dspguide.com/ch18/2.htm)或类似技术在 O(N log N)时间内执行卷积。
由于最多执行4次此类卷积,因此总复杂度 O(N log N)