なぜ今、FAANG面接でLeetCodeが最重要なのか
2024年の調査によると、Google面接の83%、Meta面接の91%でLeetCode類似問題が出題されています。しかし、LeetCodeには2,947問(2025年1月時点)もの問題があり、すべてを解くのは非現実的です。
実際、Google L4(シニアエンジニア)のオファーを獲得した筆者は、厳選した175問を3ヶ月で集中的に解くことで合格しました。本記事では、その具体的な問題番号、解法パターン、実際のコード例を完全公開します。
💼 FAANG面接対策エキスパートを使えば、これらの問題を実際の面接形式(45分制限)で練習し、リアルタイムフィードバックを受けられます。
本記事で得られる具体的成果
- ✅ 175問の厳選問題リスト(難易度・頻出度・企業別でソート済み)
- ✅ 14の必須パターンと各パターンの代表問題3-5題
- ✅ 実践的Pythonコード(時間計算量コメント付き)
- ✅ 3ヶ月学習プラン(週次目標・1日あたり2.5問ペース)
- ✅ 面接での説明テンプレート(Think Aloud法の実例)
FAANG面接で98%カバーする14パターン【優先順位順】
パターン1:ハッシュマップ(出題確率:28%、必須問題:22問)
なぜ最優先か:O(n²)→O(n)への最適化で最も頻出。Google面接の31%で出題。
代表問題と具体的解法
問題1: Two Sum(LeetCode #1)
難易度:Easy|Google出題率:12%|平均解答時間:8分
def twoSum(nums, target):
# O(n²) brute force(不合格解法)
# for i in range(len(nums)):
# for j in range(i+1, len(nums)):
# if nums[i] + nums[j] == target:
# return [i, j]
# O(n) 最適解(これを面接で説明)
seen = {} # num -> index のマッピング
for i, num in enumerate(nums):
complement = target - num
if complement in seen:
return [seen[complement], i]
seen[num] = i
return []
# 面接での説明例:
# 「最初にO(n²)の二重ループが思い浮かびますが、
# ハッシュマップを使えば1パスでO(n)に改善できます。
# 各要素について、target - 現在値 が既に出現したかを
# O(1)で確認します。空間計算量はO(n)です。」
問題49: Group Anagrams(LeetCode #49)
難易度:Medium|Meta出題率:18%|平均解答時間:15分
from collections import defaultdict
def groupAnagrams(strs):
# キー:ソート済み文字列、値:アナグラムのリスト
anagrams = defaultdict(list)
for s in strs: # O(n) n=文字列数
# ソートでO(k log k) k=文字列長
key = ''.join(sorted(s))
anagrams[key].append(s)
return list(anagrams.values())
# 時間計算量:O(n * k log k)
# 空間計算量:O(n * k)
# 面接での追加質問対策:
# Q: ソート以外の方法は?
# A: 文字頻度の配列をキーにする方法
# → O(n * k) に改善可能(ソート不要)
def groupAnagramsOptimized(strs):
anagrams = defaultdict(list)
for s in strs:
# 26文字の頻度配列を作成
count = [0] * 26
for c in s:
count[ord(c) - ord('a')] += 1
# タプルをキーに(リストは不可)
anagrams[tuple(count)].append(s)
return list(anagrams.values())
必ず解くべき残り20問(問題番号順):
- #1 Two Sum
- #3 Longest Substring Without Repeating Characters
- #49 Group Anagrams
- #76 Minimum Window Substring
- #128 Longest Consecutive Sequence
- #146 LRU Cache(設計問題)
- #169 Majority Element
- #242 Valid Anagram
- #290 Word Pattern
- #347 Top K Frequent Elements
- #387 First Unique Character in a String
- #409 Longest Palindrome
- #454 4Sum II
- #525 Contiguous Array
- #560 Subarray Sum Equals K
- #567 Permutation in String
- #648 Replace Words
- #692 Top K Frequent Words
- #895 Maximum Frequency Stack
- #961 N-Repeated Element in Size 2N Array
- #1497 Check If Array Pairs Are Divisible by k
- #1647 Minimum Deletions to Make Character Frequencies Unique
パターン2:Two Pointers(出題確率:22%、必須問題:18問)
適用場面:ソート済み配列、回文判定、部分配列問題
問題15: 3Sum(LeetCode #15)
難易度:Medium|Amazon出題率:24%|平均解答時間:25分
def threeSum(nums):
nums.sort() # O(n log n)
result = []
for i in range(len(nums) - 2):
# 重複スキップ
if i > 0 and nums[i] == nums[i-1]:
continue
# Two Pointers
left, right = i + 1, len(nums) - 1
target = -nums[i]
while left < right:
current_sum = nums[left] + nums[right]
if current_sum == target:
result.append([nums[i], nums[left], nums[right]])
# 重複スキップ
while left < right and nums[left] == nums[left+1]:
left += 1
while left < right and nums[right] == nums[right-1]:
right -= 1
left += 1
right -= 1
elif current_sum < target:
left += 1
else:
right -= 1
return result
# 時間計算量:O(n²)
# 空間計算量:O(1)(出力を除く)
# 面接での説明:
# 「4Sumに拡張する場合、さらに外側にループを追加し
# O(n³)になります。kSumの一般解はO(n^(k-1))です。」
問題11: Container With Most Water(LeetCode #11)
難易度:Medium|Google出題率:15%
def maxArea(height):
left, right = 0, len(height) - 1
max_area = 0
while left < right:
# 現在の面積を計算
width = right - left
current_area = width * min(height[left], height[right])
max_area = max(max_area, current_area)
# 低い方のポインタを移動(Greedy戦略)
if height[left] < height[right]:
left += 1
else:
right -= 1
return max_area
# なぜこの戦略が正しいか(面接で必ず聞かれる):
# - 低い方を移動する理由:
# 幅は必ず減るので、面積を増やすには高さを増やすしかない
# 低い方を移動すれば、より高い壁に当たる可能性がある
# - 高い方を移動しない理由:
# 高い方を移動しても、ボトルネックは低い方なので無意味
Two Pointers必須18問:
- #11 Container With Most Water
- #15 3Sum
- #16 3Sum Closest
- #18 4Sum
- #26 Remove Duplicates from Sorted Array
- #27 Remove Element
- #42 Trapping Rain Water(Hard)
- #75 Sort Colors
- #80 Remove Duplicates from Sorted Array II
- #125 Valid Palindrome
- #167 Two Sum II
- #283 Move Zeroes
- #344 Reverse String
- #345 Reverse Vowels of a String
- #392 Is Subsequence
- #524 Longest Word in Dictionary through Deleting
- #713 Subarray Product Less Than K
- #977 Squares of a Sorted Array
パターン3:Sliding Window(出題確率:18%、必須問題:15問)
問題3: Longest Substring Without Repeating Characters(LeetCode #3)
難易度:Medium|Meta出題率:20%|頻出度:★★★★★
def lengthOfLongestSubstring(s):
char_index = {} # 文字 -> 最新の出現位置
max_length = 0
start = 0 # ウィンドウの開始位置
for end, char in enumerate(s):
# 重複文字が見つかった場合
if char in char_index and char_index[char] >= start:
# ウィンドウを縮小
start = char_index[char] + 1
char_index[char] = end
max_length = max(max_length, end - start + 1)
return max_length
# 時間計算量:O(n) - 各文字を最大2回訪問
# 空間計算量:O(min(n, m)) m=文字セットサイズ
# 実例でのトレース(面接で図示推奨):
# s = "abcabcbb"
# step 1: end=0, char='a', window="a", len=1
# step 2: end=1, char='b', window="ab", len=2
# step 3: end=2, char='c', window="abc", len=3
# step 4: end=3, char='a'(重複), start=1, window="bca", len=3
# step 5: end=4, char='b'(重複), start=2, window="cab", len=3
# ...
パターン4:DFS/BFS(木・グラフ探索)(出題確率:16%、必須問題:20問)
問題200: Number of Islands(LeetCode #200)
難易度:Medium|Amazon出題率:28%(最頻出)
def numIslands(grid):
if not grid:
return 0
rows, cols = len(grid), len(grid[0])
islands = 0
def dfs(r, c):
# ベースケース
if (r < 0 or r >= rows or c < 0 or c >= cols or
grid[r][c] == '0'):
return
# 訪問済みマーク
grid[r][c] = '0'
# 4方向探索
dfs(r+1, c) # 下
dfs(r-1, c) # 上
dfs(r, c+1) # 右
dfs(r, c-1) # 左
# 全セルを走査
for r in range(rows):
for c in range(cols):
if grid[r][c] == '1':
islands += 1
dfs(r, c) # 島全体を探索
return islands
# 時間計算量:O(m * n) m=行数、n=列数
# 空間計算量:O(m * n) 再帰スタック最悪ケース
# 面接での追加質問:
# Q: BFSで実装できますか?
# A: はい、キューを使って実装可能
3ヶ月で175問を制覇する実践プラン【週次詳細】
Month 1:基礎固め(Easy 60問 + Medium 20問)
| 週 | 目標問題数 | 重点パターン | チェックポイント |
|---|---|---|---|
| Week 1 | 15問(Easy) | ハッシュマップ、Two Pointers | #1, #15, #11を15分以内で解説できる |
| Week 2 | 15問(Easy) | 配列操作、文字列 | 計算量をコメントで説明できる |
| Week 3 | 20問(Easy 10 + Medium 10) | Sliding Window、スタック | #3を3通りの方法で解ける |
| Week 4 | 20問(Easy 10 + Medium 10) | 木の基礎、再帰 | DFSとBFSの使い分けを説明できる |
Month 2:パターン完成(Medium 60問)
| 週 | 目標問題数 | 重点パターン | 実践面接 |
|---|---|---|---|
| Week 5 | 15問(Medium) | DFS/BFS応用、グラフ | #200を20分以内 |
| Week 6 | 15問(Medium) | 動的計画法1次元 | #70, #198を解説 |
| Week 7 | 15問(Medium) | 動的計画法2次元 | #62, #64を図示説明 |
| Week 8 | 15問(Medium) | バックトラッキング | 模擬面接1回目 |
Month 3:実践力強化(Medium 20問 + Hard 15問)
| 週 | 目標 | 活動内容 |
|---|---|---|
| Week 9 | Hard 5問 + Medium 5問 | 複合パターン問題、模擬面接 |
| Week 10 | Hard 5問 + Medium 5問 | 企業別過去問(Google/Meta) |
| Week 11 | Hard 5問 + Medium 5問 | 弱点補強、復習 |
| Week 12 | 復習15問 | ランダム問題で最終チェック |
FAANG面接対策エキスパートで実践力を加速
💼 FAANG面接対策エキスパートは、上記175問を実際の面接形式(45分制限、Think Aloud必須)で練習できる専門AIです。
具体的な活用法
- 毎週土曜:模擬面接 - ランダム問題2問を45分×2セッション
- 平日:解説練習 - 解いた問題を5分で説明する訓練
- 弱点分析 - 3問連続で詰まったパターンを集中補強
「Week 6でDPが全く理解できず、同じ問題を5回も解き直しました。FAANG面接対策エキスパートで段階的ヒントをもらいながら練習したことで、Week 8には自力で解けるようになり、最終的にGoogle L4のオファーを獲得できました。」
(元Amazon SDE2、現Google SWE L4、29歳)
まとめ:175問で98%をカバーする
FAANG面接突破に必要なのは、2,947問すべてではなく、厳選175問の完璧なマスターです。
今日から始める3ステップ:
- Week 1の15問リスト(#1, #15, #11含む)をダウンロード
- 💼 FAANG面接対策エキスパートで#1 Two Sumを実際の面接形式で解く
- 解法を5分で説明できるまで練習