【にポインタほう】

二ポインタ法 とは?

💡 左手と右手で挟み撃ち!O(n)で問題を解くワザ
📌 このページのポイント
二ポインタ法(Two Pointer) パターン①:左右から挟み込み(合計=10を探す) 1 3 5 6 7 8 9 11 L → ← R 1+11=12 > 10 → R を左へ パターン②:同方向(重複除去) 1 2 2 3 3 4 slow fast 重複スキップ → 二重ループ: O(n²) 二ポインタ法: O(n)
二ポインタ法のイメージ
ひよこ ひよこ

二ポインタ法って何?ポインタを2つ使うってこと?

ペンギン先生 ペンギン先生

そう!配列の中で「今見ている場所」を2つ持って、それぞれを条件に応じて動かす手法だよ。たとえばソート済み配列で合計が10になるペアを探すとき、左端と右端にポインタを置いて、合計が大きければ右を左に、小さければ左を右に動かすんだ。

ひよこ ひよこ

普通に二重ループで全探索するのとどう違うの?

ペンギン先生 ペンギン先生

二重ループだとO(n²)かかるけど、二ポインタ法なら各ポインタが配列を1回ずつ走査するだけだからO(n)で済むんだ。データが10万件あると、100億回 vs 10万回の差になるよ。圧倒的だよね。

ひよこ ひよこ

左右から挟むパターン以外にもあるの?

ペンギン先生 ペンギン先生

あるよ!「同方向ポインタ」パターンも重要で、2つのポインタが同じ方向に進むんだ。たとえばソート済み配列から重複を除くときに、遅いポインタが書き込み位置、速いポインタが読み取り位置を管理する。スライディングウィンドウも広い意味では同方向ポインタの一種だね。

ひよこ ひよこ

どんな問題で使えるの?

ペンギン先生 ペンギン先生

代表的なのは「Two Sum(ソート済み版)」「3Sum」「Container With Most Water」「回文判定」「リンクリストのサイクル検出」あたりだね。LeetCodeの定番問題にたくさん登場するよ。

ひよこ ひよこ

使うときのコツってある?

ペンギン先生 ペンギン先生

まず配列がソート済みかどうかを確認すること。未ソートなら先にソートするか、別のアプローチを検討する。あとはポインタの移動条件を「このとき左を動かす」「このとき右を動かす」と明確に場合分けするのがバグを防ぐコツだよ。

ひよこ ひよこ

面接で出たらどうやってアピールすればいいかな?

ペンギン先生 ペンギン先生

まず愚直なO(n²)解法を示してから「二ポインタ法で最適化できます」と切り出すのが王道だよ。計算量の改善を定量的に説明できると評価が高いんだ。コーディング面接では「なぜこれで正しいか」の不変条件(invariant)を説明できるとさらにポイントが高いね。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「二ポインタ法」って出てきたら「2つの位置を動かして効率よく探索する方法」と思えればだいたいOK!
📖 おまけ:英語の意味
「Two Pointer Technique」 = 2つのポインタを使う技法
💬 ポインタといってもC言語のポインタじゃなく、配列の「今見ている位置」を2つ管理するテクニックだよ
← 用語集にもどる