【にポインタほう】
二ポインタ法 とは?
💡 左手と右手で挟み撃ち!O(n)で問題を解くワザ
📌 このページのポイント
二ポインタ法って何?ポインタを2つ使うってこと?
普通に二重ループで全探索するのとどう違うの?
左右から挟むパターン以外にもあるの?
あるよ!「同方向ポインタ」パターンも重要で、2つのポインタが同じ方向に進むんだ。たとえばソート済み配列から重複を除くときに、遅いポインタが書き込み位置、速いポインタが読み取り位置を管理する。スライディングウィンドウも広い意味では同方向ポインタの一種だね。
どんな問題で使えるの?
代表的なのは「Two Sum(ソート済み版)」「3Sum」「Container With Most Water」「回文判定」「リンクリストのサイクル検出」あたりだね。LeetCodeの定番問題にたくさん登場するよ。
使うときのコツってある?
まず配列がソート済みかどうかを確認すること。未ソートなら先にソートするか、別のアプローチを検討する。あとはポインタの移動条件を「このとき左を動かす」「このとき右を動かす」と明確に場合分けするのがバグを防ぐコツだよ。
面接で出たらどうやってアピールすればいいかな?
まず愚直なO(n²)解法を示してから「二ポインタ法で最適化できます」と切り出すのが王道だよ。計算量の改善を定量的に説明できると評価が高いんだ。コーディング面接では「なぜこれで正しいか」の不変条件(invariant)を説明できるとさらにポイントが高いね。
まとめ:ざっくりこれだけ覚えればOK!
「二ポインタ法」って出てきたら「2つの位置を動かして効率よく探索する方法」と思えればだいたいOK!
📖 おまけ:英語の意味
「Two Pointer Technique」 = 2つのポインタを使う技法
💬 ポインタといってもC言語のポインタじゃなく、配列の「今見ている位置」を2つ管理するテクニックだよ