0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

🧩 LeetCodeの40%を攻略するハッシュマップの考え方

0
Posted at

🧩 LeetCodeの40%を攻略するハッシュマップの考え方

はじめに

もし Two Sum を解いたときに、

「なんでこんなにうまく動くんだろう?」

と思ったことがあるなら、この記事はきっと役に立ちます。

ハッシュマップはシンプルで強力なデータ構造ですが、意外と見落とされがちです。
しかも Python ではとても簡単に扱えます。

そして一番重要なのはこれです:

ハッシュマップの問題はランダムではなく、いくつかのパターンに従っている

このパターンを理解すると、問題を1つずつ解くのではなく、
“まとめて”解けるようになります。


🧩 ハッシュマップの5つのパターン

ほとんどのハッシュマップ問題は、次の5つに分類できます:

  1. Lookup(存在確認)
  2. Counting(頻度カウント)
  3. Grouping(グループ化)
  4. Sliding Window + Hash Map
  5. 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つずつ解くのはもうやめましょう。

👉 パターンで考えるようになると:

  • 問題に見覚えが出てくる
  • 解法が自然に思い浮かぶ
  • 面接がぐっと楽になる
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?