指定された合計になるペアを見つける
O(n^2) の全探索を上回ります
「指定された合計になるペアを見つける」はCoddyKit上の無料Coding Interview Prepレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCoding Interview Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Coding Interview Prepコースには全4レッスンが含まれています。
ペア和問題
配列と目標値が与えられたとき、その値になるように足し合わされる2つの値を探します。競技プログラミングで最もよく出る入門問題の1つです。🔍
全探索
分かりやすい方法は、2重ループですべてのペアを試すことです。動作はしますが、全ペアの確認には O(n^2) かかるため、非常に遅くなることがあります。
for i in range(n):
for j in range(i + 1, n):
if a[i] + a[j] == target:
return (i, j)全探索が破綻する場面
n が 100000 近くになると、O(n^2) は100億回の確認になります。そのため TLE になってしまいます。制約は、もっと速い方法を探すように示しています。
ソートしてから走査
先に配列をソートすれば、両端から2ポインタで1回の走査中に解けます。ソートに O(n log n)、その後の走査に O(n) かかります。
a.sort()
left, right = 0, len(a) - 1目標値と比較する
各ステップで a[left] + a[right] を確認します。その1つの値だけで、次にどちらへ動くべきかを迷わず決められます。
total = a[left] + a[right]完全一致: 完了
合計が目標値と等しければ、ペアが見つかったことになります。有効な答えを1つ見つければよいので、すぐに返してください。
if total == target:
return (left, right)それ以外は調整する
合計が小さすぎる場合は left を右へ、大きすぎる場合は right を左へ動かします。ソート済みの順序により、どの移動も必ず解に近づきます。
elif total < target:
left += 1
else:
right -= 1ペアが存在しない場合
一致しないままポインタが交差した場合、有効なペアは存在しません。ループが終了したこと自体が、完全な答えになります。
ハッシュセットという選択肢
元のインデックスを保持する必要がある場合は、ハッシュセットのほうが簡潔です。各値について、target からその値を引いた値がすでに出現しているかを確認します。
seen = set()
for x in a:
if target - x in seen:
# found
pass
seen.add(x)方法を選ぶ
配列がソート済み、またはソートしてよい場合は2ポインタ法を使います。ソートせずに O(n) を実現したい場合やインデックスを保持する必要がある場合は、ハッシュセットを使います。
重複に注意する
ある値を自分自身と組み合わせられる場合でも、2つのインデックスが異なることを確認してください。left != right または i != j を簡単に確認すれば、この落とし穴を避けられます。
確認問題
目標値になるペアを探すとき、O(n^2) の全探索より速い方法を使いたいとします。
まとめ
2ポインタ法でソートしてから走査すれば、O(n log n) で目標のペアを見つけられます。インデックスが重要な場合はハッシュセットで O(n) にできます。制約に応じて選びましょう。✅
よくある質問
「指定された合計になるペアを見つける」レッスンは無料ですか?
はい。「指定された合計になるペアを見つける」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Coding Interview Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Coding Interview Prepコースには全4レッスンが含まれています。
「指定された合計になるペアを見つける」で何を学びますか?
O(n^2) の全探索を上回ります ブラウザで直接実行するハンズオンコードでCoding Interview Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Coding Interview Prepを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCoding Interview Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「指定された合計になるペアを見つける」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCoding Interview Prepレッスンでコードを書いて実行できますか?
はい。すべてのCoding Interview Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- ソート済み配列での Two Pointers
- 指定された合計になるペアを見つける
- 重複をその場で削除する
- 2 つのソート済みシーケンスをマージする