给定一个未排序的正整数和所需总和的数组,如果存在这样的索引,则按升序打印的最佳方法是4个不同的基于0的元素中元素的索引,它们加起来为输入和。 如果有多个解决方案,我只需要根据字典顺序打印最低的解决方案
示例输入:
A = 3 2 1 4 5 7 6 9 7 8
S = 30
示例输出:
5 6 7 9
答案 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|!
及以上限制