これは完全な答えではありません。しかし、リストがソートされていれば、問題は簡単に実行できますO(n)
。それを行うには、すべての数字をリンクされたリストに配置します。頭へのポインターを維持し、途中でどこかに。各ステップで、先頭の 2 つの要素を先頭から取り出して出力し、合計が必要な場所まで中央のポインターを進め、合計を挿入します。
開始ポインタはほぼ回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