【アルゴリズム】ダブルポインタの裏技・小技(1):ポインタの衝突

1. コリジョンポインタ

        衝突ポインタは 2 つのポインタで構成され、それぞれデータの先頭と末尾を指します。

        2つのポインタはそれぞれ両端から移動し、答えと一致する位置を見つけて停止します衝突するポインタは主に順序付けされた配列の合計に使用されます。トピックを使用して説明します。

         例は次のとおりです。

         トピックによれば、次の条件が導き出されます。

  • 配列は昇順に並べられます。
  • 同じ要素を繰り返すことはできません (つまり、index1=index2 は無理です) が、1<index1<index2<=numbers.Length の関係があります
  • 唯一の回答にのみ対応します。つまり、複数の回答が存在する可能性があり、そのうちの 1 つだけを出力する必要があります。

        トラバーサル、二分探索、動的プログラミングなどに 2 つを使用する多くの解決策があります。例 1 を使用して衝突ポインタを説明します。

         配列の先頭部分と末尾部分をそれぞれ指す、2 つの先頭ポインターと末尾ポインターを初期化します。

         現在の値の加算が目標数値 (2 + 15 = 17 > 9) を満たすかどうかを判断し、末尾ポインターが左に移動します

        もう一度判断してみましょう: 2 + 11 = 13 > 9、末尾ポインタを左に動かし続けます。

        2 + 7 = 9 == 9、結果を出力します。これを見て混乱する人も多いと思われますがなぜこのように正しい結果が得られるのでしょうか例を使用して分析し、説明してみましょう。

         考えられるすべての加算結果を列挙します。

         2 番目の条件に従って、まず、index1 = Index 2の場合を除外します。

         黒い部分が削除された部分です。

        次に、index1 > Index2 の部分を削除します。

 

        現在の先頭ポインターと末尾ポインターが指す値の合計は 17 で、オレンジ色でマークされています。

 

        2+15 = 17 < 22。2つの数値の合計がさらに増加する必要があることを示します。末尾ポインタが指す数値はすでに最大であるため、合計を計算するには先頭ポインタを右に移動する必要があります。次に、「15」がすでに最大の数であるため、先頭ポインタが指す「2」は末尾ポインタが指す「6、10、12、15」と一致しないことが推測されます。ターゲット数値を満たさない場合、それより小さい他の数値 言うまでもなく、現在のヘッド ポインターは右に移動します。

         現在の状況は次のとおりです。

         次に、6 + 15 = 21 < 22 と推測してみましょう。これは、2 つの数値の合計が十分に大きくなく、増加し続け、ヘッド ポインタが右に移動することを示しています。

        前述のように、再度 1 つの項目を除外します。

        10 + 15 = 25 > 22 ですが、上記の原理を理解していれば、ここでも非常に簡単に理解できます。つまり、2 つの数値の合計が目標の数値よりも大きいため、2 つの数値の合計は先頭ポインタが指す数値はすでに最小であるため、減らす必要があります。そのため、2 つの数値の合計を減らすには末尾ポインタを左に移動する必要があります。

         Y から 1 つの項目を除外します。

        最後に残った数字が正解であり、そこから衝突ポインタの判定条件を導き出すことができます。

  • 2 つの数値の合計がターゲット数値より大きく、末尾ポインタが左に移動します。
  • 2 つの数値の合計が目標数値より小さいため、ヘッド ポインタが右に移動します。
  • 2 つの数値の合計がターゲット数値に等しい場合、結果を出力します

        コリジョン実装のコードは次のとおりです (参考)。

        次の章では、中間数値を迅速に取得するために使用される高速ポインタと低速ポインタを紹介します。

おすすめ

転載: blog.csdn.net/qq_41884002/article/details/128289581