查找未排序数组中的所有对,其总和可被4整除

时间:2015-07-01 08:22:33

标签: arrays algorithm time-complexity big-o

查找未排序数组中的所有对,其总和可除以4。 请建议一种比O(n * n)

更好的算法
e.g.

[1,2,4,0,20,22]
k=4
[0,4]
[0,20]
[20,4]
[2,22]

1 个答案:

答案 0 :(得分:8)

可以在O(n+k)中完成,其中k是此类对的数量(可以在O(n^2)本身)。

我们的想法是创建4个列表list0,list1,list2,list3,其中list_i包含x所有元素x%4 ==i

创建这些列表非常简单,可以在O(n)中完成。

一旦你有这些列表,你所要做的就是获得所有对,其中一个元素来自list_i,其他元素位于list_((4-i)%4)(所以list0 + list0,list1 + list3,list2 +列表2)。这可以非常简单地完成,并且可以非常有效地生成所有对。

优化注释:它可以通过根据模式“排序”数组本身来就地完成(非常少的额外空间),因此您将在数组本身中显示列表。

示例:(从您的列表中进行最少的修改)

array = [1,2,4,0,20,22,7]

生成列表:

list0 = [0,4,20]
list1 = [1]
list2 = [2,22]
list3 = [7]

现在,

"combine" list0 with itself: (0,4), (4,20), (0,20)
"combine" list2 with itself: (2,22)
"combine" list1 with list3: (1,7)