🧩 LeetCodeの40%を攻略するハッシュマップの考え方
はじめに
もし Two Sum を解いたときに、
「なんでこんなにうまく動くんだろう?」
と思ったことがあるなら、この記事はきっと役に立ちます。
ハッシュマップはシンプルで強力なデータ構造ですが、意外と見落とされがちです。
しかも Python ではとても簡単に扱えます。
そして一番重要なのはこれです:
✅ ハッシュマップの問題はランダムではなく、いくつかのパターンに従っている
このパターンを理解すると、問題を1つずつ解くのではなく、
“まとめて”解けるようになります。
🧩 ハッシュマップの5つのパターン
ほとんどのハッシュマップ問題は、次の5つに分類できます:
- Lookup(存在確認)
- Counting(頻度カウント)
- Grouping(グループ化)
- Sliding Window + Hash Map
- Set + Hash Map の組み合わせ
順番に見ていきましょう。
🧠 1. Lookup Pattern(存在確認)
🔑 コアの考え方
「この値はすでに見たことがあるか?」
✅ 使う場面
- ペアを見つける
- 要素の存在確認
- 補数(complement)のマッチング
🧪 例題
- Two Sum
- Contains Duplicate
- Valid Anagram
💡 なぜうまくいくのか
ハッシュマップは O(1) でアクセスできるため:
- ❌ 全てを探索(O(n²))
- ✅ 一瞬で確認(O(n))
👉 これがハッシュマップ思考の基礎です
🧮 2. Counting Pattern(頻度カウント)
🔑 コアの考え方
「各要素は何回出現するか?」
✅ 使う場面
- 出現頻度の分析
- 重複の検出
- 上位K個・多数決問題
🧪 例題
- Top K Frequent Elements
- Sort Characters by Frequency
- Majority Element
🔧 よく使うツール
from collections import Counter, defaultdict
💡 なぜうまくいくのか
次のように保存します:
👉 値 → 出現回数
このパターンはあらゆる場面で登場します:
- 配列
- 文字列
- ログ
- イベントデータ
📦 3. Grouping Pattern(グループ化)
🔑 コアの考え方
「異なるデータでも同じキーを共有できる」
✅ 使う場面
- 類似データのクラスタリング
- カテゴリ分類
- パターンの正規化
🧪 例題
- Group Anagrams
- Group Shifted Strings
- Group People by Size
🔐 よく使うキー
- ソート済み文字列(アナグラム)
- 頻度タプル
- 正規化パターン
💡 なぜうまくいくのか
データを共通の特徴に変換してまとめます:
👉 キー → 要素のリスト
このパターンは特に Google系の面接でよく出題されます。
🪟 4. Sliding Window + Hash Map
🔑 コアの考え方
「ウィンドウを動かしながら状態を管理する」
✅ 使う場面
- 部分文字列の問題
- 連続区間
- 最長/最短の条件探索
🧪 例題
- Longest Substring Without Repeating Characters
- Minimum Window Substring
- Longest Repeating Character Replacement
📊 ハッシュマップで管理するもの
- 文字の出現回数
- ウィンドウの条件
- 拡張・縮小のタイミング
💡 なぜうまくいくのか
配列を1回で処理しながらウィンドウを調整できます:
👉 効率的かつ柔軟 → O(n)
🔗 5. Set + Hash Map の組み合わせ
🔑 コアの考え方
「Setで存在確認、Mapで構造を管理する」
✅ 使う場面
- 連続する数列の問題
- グラフ的な構造
- パターンマッチング
🧪 例題
- Longest Consecutive Sequence
- Word Pattern
- Happy Number
💡 なぜうまくいくのか
役割を分けて使います:
- ✅ Set → 高速な存在確認
- ✅ Map → 関係や構造の管理
🧠 パターン早見表
| 問題タイプ | パターン |
|---|---|
| ペア・補数を見つける | Lookup |
| 出現回数を数える | Counting |
| 似た要素をグループ化する | Grouping |
| 部分文字列・連続区間 | Sliding Window |
| 一意性・数列・循環 | Hybrid |
🚨 面接での見抜き方
問題文の中にこんな表現があれば要注意:
- 「2つの数を見つける」
- 「存在するか確認する」
- 「何回出るか数える」
- 「グループに分ける」
- 「最長の部分文字列」
👉 これらは単なるヒントではなく、パターンのサインです
📝 まとめ
- ハッシュマップの本質は O(1)で考えること
- 多くの問題は たった5つのパターンに分類できる
- 本当に重要なのは:
👉 解法を覚えることではなく、パターンを見抜くこと
🚀 おわりに
問題を1つずつ解くのはもうやめましょう。
👉 パターンで考えるようになると:
- 問題に見覚えが出てくる
- 解法が自然に思い浮かぶ
- 面接がぐっと楽になる