这不是一个完整的答案。但是,如果列表已排序,那么您的问题在O(n)
. 为此,请将所有数字排列在一个链表中。保持一个指向头部的指针,并在中间的某个地方。在每一步中,从头部取出顶部的两个元素,打印它们,将中间指针推进到总和应该到达的位置,然后插入总和。
起始指针将移动接近2n
时间,中间指针将移动大约n
时间,并带有n
插入。所有这些操作都是O(1)
这样的总和是O(n)
。
一般来说,您无法按时间排序O(n)
,但在一些特殊情况下您可以。所以在某些情况下是可行的。
一般情况当然是无法及时解决的O(n)
。为什么不?因为给定您的输出,O(n)
您可以及时运行程序的输出,按顺序建立成对总和列表,并将它们从输出中过滤掉。剩下的是按排序顺序排列的原始列表的元素。这将给出一个O(n)
通用的排序算法。
更新:我被要求展示你如何从输出 (10, 11), (12, 13), (14, 15), (21, 25), (29, 46) 到输入列表? 诀窍是你总是把所有东西都整理好,然后你就知道怎么看。对于正整数,下一个即将使用的总和将始终位于该列表的开头。
Step 0: Start
input_list: (empty)
upcoming sums: (empty)
Step 1: Grab output (10, 11)
input_list: 10, 11
upcoming_sums: 21
Step 2: Grab output (12, 13)
input_list: 10, 11, 12, 13
upcoming_sums: 21, 25
Step 3: Grab output (14, 15)
input_list: 10, 11, 12, 13, 14, 15
upcoming_sums: 21, 25, 29
Step 4: Grab output (21, 25)
input_list: 10, 11, 12, 13, 14, 15
upcoming_sum: 29, 46
Step 5: Grab output (29, 46)
input_list: 10, 11, 12, 13, 14, 15
upcoming_sum: 75