查找未排序数组中的所有对,其总和可除以4。 请建议一种比O(n * n)
更好的算法e.g.
[1,2,4,0,20,22]
k=4
[0,4]
[0,20]
[20,4]
[2,22]
答案 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)