算法 - 以唯一对

时间:2016-01-04 20:34:33

标签: python algorithm combinatorics minmax code-complexity

我在接受任务时遇到了困难,而且我很确定问题的文字存在缺陷。我已将其翻译成:

考虑列表x [1..2n],其元素来自{1,2,..,m},m< ñ。在Python中提出并实现一种复杂度为O(n)的算法,该算法将元素分组成对((x [i],x [j])与i

For example, x = [1,5,9,3] can be paired in three ways:
(1,5),(9,3) => Sums: 6, 12 => Maximum 12
(1,9),(5,3) => Sums: 10, 8 => Maximum 10
(1,3),(5,9) => Sums: 4, 14 => Maximum 14
                              ----------
                              Minimum 10
Solution to be returned: (1,9),(5,3)

令我奇怪的事情如下:

  • 表格内容定义它表示有1..2n, from {1..m}, m < n的元素。但是如果m < n,则没有足够的元素来填充列表而不复制一些,这是不允许的。那么我会假设m >= 2n。此外,该示例包含n = 2但使用大于1的元素,因此我假设它们的意思是什么。

  • O(n)复杂性?那么有没有办法将它们组合在一个循环中?我无法想到任何事情。

我的计算:

For n = 4:
Number of ways to combine: 6
Valid ways: 3

For n = 6
Number of ways to combine: 910
Valid ways: 15

For n = 8
Number of ways to combine: >30 000
Valid ways: ?

很明显,我不能使用蛮力然后弄清楚它是否有效。我用来计算总可行方式的公式是

C(C(n,2),n/2)

问题:

这个问题写错了,无法解决?如果是这样,应该添加或删除哪些条件才能使其可行?如果您要在python中建议一些代码,请记住我不能使用任何类型的任何预构建函数。谢谢

1 个答案:

答案 0 :(得分:1)

假设排序列表:

def answer(L):
    return list(zip(L[:len(L)//2], L[len(L)//2:][::-1]))

或者如果您想更多地手动执行此操作:

def answer(L):
    answer = []
    for i in range(len(L)//2):
        answer.append((L[i], L[len(L)-i-1)]))
    return answer

输出:

In [3]: answer([1,3,5,9])
Out[3]: [(1, 9), (3, 5)]