Python:在未排序的数组中找到四个数字的算法,它满足所需的总和

时间:2014-12-29 11:12:19

标签: python algorithm

给定一个未排序的正整数和所需总和的数组,如果存在这样的索引,则按升序打印的最佳方法是4个不同的基于0的元素中元素的索引,它们加起来为输入和。 如果有多个解决方案,我只需要根据字典顺序打印最低的解决方案

示例输入:

A = 3 2 1 4 5 7 6 9 7 8
S = 30

示例输出:

5 6 7 9

1 个答案:

答案 0 :(得分:1)

In [36]: A
Out[36]: [3, 2, 1, 4, 5, 7, 6, 9, 7, 8]

In [37]: S
Out[37]: 30

In [38]: N
Out[38]: 4

In [39]: for tup in itertools.combinations(A,N):
   ....:     if sum(tup) == S:
   ....:          for perm in itertools.product(*[[i for i,num in enumerate(A) if num==n] for n in tup]):
   ....:              print(*sorted(perm))
   ....:             
5 6 7 9
6 7 8 9
5 6 7 9
6 7 8 9

复杂度:

  • for tup in itertools.combinations(A,N)费用(O(|A|选择N))
  • sum(tup)需要花费O(N
  • [[i for i,num in enumerate(A) if num==n] for n in tup]需要花费O(N*|A|
  • itertools.product(*[[i for i,num in enumerate(A) if num==n] for n in tup])因此需要花费O((N*|A|)!)

所以,你最终花了(|A|选择N)* [N + {{N*|A|)*(N*|A|)!}],由|A|!

以下|A|^2 * |A|!及以上限制