これはわずかに異なるアプローチであり、以前のコメントの1つによって示唆され、alestanisによる回答に似ていますが、配列の分割に依存しないという点でわずかに異なります。配列を1回通過し(ただし、O(N)を保証するものではありません)、考慮されているサブシーケンスの開始点と終了点だけでなく、2つの最小値を追跡する必要があります。
連続するサブシーケンスですべての可能なペアの合計が20になるには、2つの最小要素の合計が> = 20である必要があります。したがって、後続の要素のペア(array[0]
およびarray[1]
開始)を検討することから始めます。合計が20以上にならない場合は、にarray[1]
進み、array[2]
。合計が20以上の場合は、右側のエンドポイントを1つ拡張します。新しい要素が他の2つよりも大きい場合は、サブシーケンスにすでに含まれているものを含めて合計が20以上になり、右手をもう一度展開できます。それより少ない場合は、いくつかの比較で2つの最小要素を選択する必要があります。また、2つの新しい最小要素の合計が20以上にならない場合は、追加した要素をサブシーケンスから削除し、注意してください。この特定のサブシーケンスは、既存のサブシーケンスの2番目と3番目の要素からやり直します。最後に、一般に、制約に適合するサブシーケンスのリストがあり、最初または最大、あるいは必要なものを簡単に選択できるはずです。
たとえば、リストしたシーケンスを使用します。
-10 -100 5 2 4 7 10 23 81 5 25
から始め-10, -100
ます。合計は20にならないので、右に1を移動し-100, 5
ます。繰り返しますが、これらの合計は20にならないので、続行します。合計が20になる最初のペアはです10, 23
。そこで、範囲をに拡張します10, 23, 81
。81は2つの最小値の両方よりも大きいので、再び展開して10, 23, 81, 5
。5は10と23の両方よりも小さいため、新しい最小値は5と10であり、合計は20になりません。したがって、5を追加するのは間違いであり、後戻りする必要があります。10, 23, 81
そのようなサブシーケンスの1つが見つかります。次に、に進みます。これにより、基準も満たす23, 81
サブシーケンスに移動します。23, 81, 5, 25
したがって、最後に、基準を満たす4つの可能なサブシーケンスがあります- 10, 23, 81
、、、、および。元のリストの最後の要素を含むソリューションができたら、追加のソリューションを見つけないことで、最後の2つを取り除くことができます。これにより、最初の2つの可能性だけが残ります。そこから、最初または最長のいずれかを選択できます。23, 81, 5, 25
81, 5, 25
5, 25