アルゴリズムのチートシート

コーディング面接問題と地続き

コーディング面接に出るアルゴリズムの 8 テーマ (計算量とオーダー記法、配列と文字列、ハッシュマップ、二分探索、スタックとキュー、再帰と木、幅優先探索、動的計画法) を、たとえ、手の順の表、Python と JavaScript の動くコードでまとめたチートシートです。

文 ゆめさく ・ 公開 2026年10月30日 ・ 更新 2026年10月30日

8 つのテーマの早見表

コーディング面接の問題は、数えるほどの型の組み合わせです。この頁は、出番が多い 8 つのテーマを、たとえ話、手の順の表、動くコードの 3 点で 1 つずつまとめたチートシートです。コードは Python と JavaScript の両方を実際に動かして、出力を確かめてあります。

探しているものへは、ここから移れます。計算量とオーダー記法、二分探索、幅優先探索、動的計画法、まずこれだけは解く 14 問。計算量のいちばん短い早見表は次の通りです。

計算量代表例
O(1)添字で読む、ハッシュで引く
O(log n)二分探索
O(n)1 周して調べる
O(n log n)ソート
O(n²)二重の繰り返し

8 つのテーマは次の通りです。

テーマひとことで
1. 計算量とオーダー記法手間の増え方を、n の式で言う
2. 配列と文字列番号つきの箱を、添字と窓で読む
3. ハッシュマップ名札つきロッカーで、探す手間を 1 回にする
4. ソートと二分探索並べておき、範囲を半分ずつ絞る
5. スタックとキューお皿は後から、行列は先から取り出す
6. 再帰と木自分を呼ぶ関数で、枝分かれをたどる
7. グラフ探索と幅優先探索つながりを、近い順か奥からたどる
8. 動的計画法 (DP)途中の答えをメモして、同じ計算をやめる

まずこれだけは解く 14 問

準備の時間が限られるなら、まず次の 14 問です。最優先の 8 問を先に解き、余裕があれば次の 6 問へ進みます。問題の名前は、英語の問題集でよく知られた題です。ゆめさくに日本語の問題があるものは、題から解説と、その場で書ける欄へ進めます。まだ無いものは、英語の問題集の番号だけを書きました。

最優先の 8 問です。

問題覚える型計算量 (時間 / 空間)
Two Sum (1)ハッシュで相方を探すO(n) / O(n)
Valid Parentheses (20)スタックで対応を見るO(n) / O(n)
Binary Search (704)半分ずつ絞るO(log n) / O(1)
Contains Duplicate (217)セットで見たことがあるか調べるO(n) / O(n)
Valid Anagram (242)文字の数を数えるO(n) / O(1)
Reverse Linked List (206)つなぎ替えるO(n) / O(1)
Maximum Depth of Binary Tree (104)再帰で深さを求めるO(n) / O(高さ)
Climbing Stairs (70)DP の入門O(n) / O(1)

次に大事な 6 問です。

問題覚える型計算量 (時間 / 空間)
Best Time to Buy and Sell Stock (121)これまでの最安値を持って 1 周するO(n) / O(1)
Valid Palindrome (125)両端から寄せるO(n) / O(1)
Longest Substring Without Repeating Characters (3)窓を広げて、重なったら縮めるO(n) / O(文字の種類)
Merge Two Sorted Lists (21)2 つの先頭を見比べてつなぐO(n + m) / O(1)
Number of Islands (200)幅優先か深さ優先で島を塗りつぶすO(行 × 列) / O(行 × 列)
Group Anagrams (49)並べ替えた文字を名札にするO(n × L log L) / O(n × L)

表の ( ) の数は、英語の問題集の番号です。計算量は、標準的な解き方の値です。Valid Anagram の空間 O(1) は、文字が小文字の 26 種類だけのときです。Longest Substring の空間は、窓の中に入る文字の種類の数です。Group Anagrams は、単語の数を n、1 語の長さを L としています。Maximum Depth of Binary Tree の空間は、再帰の深さ、つまり木の高さの分です。Number of Islands は、訪れた印を行と列の数の分だけ持つので、空間も行 × 列です。

問題文の言葉から、使うテーマを選ぶ

面接では、問題文の言葉が型の手がかりになります。次の表は、まず思い出す先の目安です。当たらないこともあるので、決め打ちせず、最初の 1 分で候補を 2 つ出して比べます。

問題文の手がかりまず思い出すテーマ
足して target になる 2 つ、重複、出てきた回数3 ハッシュマップ
連続した部分、長さ k の区間、回文2 配列と文字列
小さい順に並んでいる、O(log n) で4 二分探索
括弧の対応、直前に戻る、取り消す5 スタック
木の深さ、全部の組み合わせ、同じ形の小さい問題6 再帰と木
最短の手数、つながっているか、近い順に7 グラフ探索
何通りあるか、最大、最小で、同じ小問題が何度も出る8 動的計画法
n が 10 万、制約が大きい1 計算量から使える手間を逆算する

1. 計算量とオーダー記法 (手間の増え方)

たとえ 辞書で言葉を探すとき、1 ページ目から順にめくると、ページが 10 倍になれば手間も約 10 倍です。真ん中を開いて半分ずつ絞れば、ページが 10 倍でも手間は数回増えるだけです。この「入力が増えたとき、手間がどう増えるか」を式で言うのが計算量です。

計算量には、命令の回数で数える時間計算量と、使う記憶の量で数える空間計算量があります。オーダー記法 (Big-O) は、n が大きいときにいちばん効く項だけを O( ) の中に書く表し方です。次の表は、n が 10、100、1,000 のときの手間の目安です。

計算量n が 10n が 100n が 1,000
O(1)111
O(log n)約 3約 7約 10
O(n)101001,000
O(n log n)約 33約 660約 10,000
O(n²)10010,0001,000,000

O(1) は一定、O(log n) は対数、O(n) は線形、O(n²) は二重の繰り返しです。log n の底は 2 で数えています。オーダー記法では底の違いは定数倍なので、底は書きません。O(2ⁿ) は n が 100 で約 1.3 × 10 の 30 乗になり、現実の時間では終わりません。

オーダー記法への直し方は、係数と小さい項を捨てるだけです。

手間の式オーダー記法捨てたもの
3n + 5O(n)係数の 3 と定数の 5
n² + 100nO(n²)小さい項の 100n
繰り返しを 2 つ続ける (n + n)O(n)足し算は大きいほうだけ
繰り返しの中で繰り返す (n × n)O(n²)掛け算は掛けたまま

計算量には、いちばん悪い入力のときの手間 (最悪計算量) と、ふつうの入力での手間 (平均計算量) があります。面接で何も断らずに聞かれたら、最悪を答えます。ハッシュの読み書きは平均 O(1) で最悪 O(n)、クイックソートは平均 O(n log n) で最悪 O(n²) のように、差がある物は両方言います。

log n が出てくる場所は 2 つです。1 つは、毎回半分に絞る繰り返しで、二分探索は log n 回で終わります。もう 1 つは、半分に分け続けたときの段の数です。マージソートは log n 段あり、各段で n 個を見るので、全体で n log n です。

よく使う操作の手間は次の通りです。

操作手間補足
配列の添字で読むO(1)番号で直接開ける
配列の末尾に足すO(1)平均して。償却と呼ぶ
配列の先頭に足す、消すO(n)全部ずらす
配列から値で探すO(n)端まで見る
dict、Map、Set の読み書きO(1)平均。最悪は O(n)
ソートO(n log n)sorted、sort
並んだ配列の二分探索O(log n)半分ずつ捨てる
点 n 個と辺 m 本の探索O(n + m)幅優先と深さ優先

アルゴリズムごとの手間は次の通りです。空間は、入力のほかに使う記憶の量です。

アルゴリズム平均最悪空間
線形探索O(n)O(n)O(1)
二分探索O(log n)O(log n)O(1)
バブルソートO(n²)O(n²)O(1)
挿入ソートO(n²)O(n²)O(1)
マージソートO(n log n)O(n log n)O(n)
クイックソートO(n log n)O(n²)O(log n)
幅優先、深さ優先O(n + m)O(n + m)O(n)
ダイクストラ法O((n + m) log n)同じO(n)

クイックソートの空間は、平均した再帰の深さです。ダイクストラ法は、優先度つきキューに二分ヒープを使ったときの値です。n は点の数、m は辺の数です。マージソート、挿入ソート、バブルソートは、同じ値の並びの順を変えません (安定)。クイックソートの普通の書き方は変えることがあります。Python の sorted と JavaScript の sort は安定です。

問題文に n の大きさが書いてあれば、使える計算量を逆算できます。どれも目安で、言語や判定の条件で変わります。桁で当たりをつける使い方です。

問題文の n使える計算量の目安そのときの手数
10 以下O(n!) 全部の並べ方約 363 万
20 以下O(2ⁿ) 全部の選び方約 105 万
100 から 200 以下O(n³) 三重の繰り返し100 万から 800 万
1,000 以下O(n²)100 万
10 万以下O(n log n)約 166 万
100 万以上O(n) か O(n log n)n log n で約 2,000 万
10 の 12 乗以下O(√n) 約数を平方根までだけ調べる100 万

次のコードは、1 から n までの並びで、いちばん後ろの数を探すのに、端から順に探す方法と、二分探索で絞る方法が何回で終わるかを数えます。n が 10 倍になると、前者は 10 倍に増えますが、後者は 3 回ほどしか増えません。

Python

def linear(nums, t):
    steps = 0
    for x in nums:
        steps += 1
        if x == t:
            break
    return steps

def binary(nums, t):
    lo, hi = 0, len(nums) - 1
    steps = 0
    while lo <= hi:
        steps += 1
        mid = (lo + hi) // 2
        if nums[mid] == t:
            break
        if nums[mid] < t:
            lo = mid + 1
        else:
            hi = mid - 1
    return steps

for n in (10, 100, 1000):
    nums = list(range(n))
    print(n, linear(nums, n - 1),
          binary(nums, n - 1))

実行した出力

10 10 4
100 100 7
1000 1000 10

要点 計算量は秒数ではなく、n が増えたときの増え方です。まず「繰り返しは何重か」を数え、半分ずつ絞っていれば log n を疑います。

面接での一言 「全部の要素を 1 回ずつ見るので時間は O(n)、追加の記憶は変数だけなので O(1) です」と、時間と空間を 1 文で言い切ります。

動きで見る 線形探索、二分探索、マージソート、クイックソートの動きを、1 手ずつ見られます。

2. 配列と文字列 (番号つきの箱)

たとえ 番号のついた箱が 1 列に並んでいます。番号 (添字) を言えば、端から数えずに、その箱が一発で開きます。

添字0123
値5281

文字列は、文字の箱が並んだものとして読めます。Python も JavaScript も、文字列は作ったあとに 1 文字だけ書き換えることができません。ループの中で文字列をつなぎ続けるより、配列に溜めて最後に 1 回つなぐほうが安全です。

配列の問題で最も出番が多いのは、決まった長さの窓を 1 つずつずらす形です。数列 2、1、5、1、3、2 で、長さ 3 の窓の和の最大を求めます。窓をずらすたびに、入ってくる数を足し、出ていく数を引けば、足し直さずに済みます。

手窓の中身和計算
12、1、58最初に 3 つ足す
21、5、178 から 2 を引き、1 を足す
35、1、397 から 1 を引き、3 を足す
41、3、269 から 5 を引き、2 を足す

Python

def max_window(nums, k):
    cur = sum(nums[:k])
    best = cur
    for i in range(k, len(nums)):
        cur += nums[i]
        cur -= nums[i - k]
        best = max(best, cur)
    return best

nums = [2, 1, 5, 1, 3, 2]
print(max_window(nums, 3))

実行した出力

9

要点 窓は毎回足し直さず、入る分と出る分の差だけを動かします。足し直すと O(n × k)、差だけなら O(n) です。並んだ配列や文字列は、両端から寄せていく 2 本の添字 (ツーポインタ) でも読めます。

面接での一言 「窓を 1 つずらすたびに足し引きは 2 回だけなので、全体で O(n) です」と言います。

3. ハッシュマップ (名札つきロッカー)

たとえ 名札のついたロッカーが並んでいます。名札 (キー) を言えば、端から順に探さず、そのロッカーへ直接行けます。Python の dict、JavaScript の Map と Set がこの仕組みです。

典型は、数列の中から足して target になる 2 つの数を見つける問題 (Two Sum) です。総当たりは O(n²) ですが、見た数をロッカーに入れておき、必要な相方 (target から見た数を引いた値) がもう入っているかを聞けば、1 周で終わります。数列 3、8、2、7 で target が 9 の手の順は次の通りです。

見る数必要な相方ロッカーの中そのあと
36空3 を入れる (0 番)
813 だけ8 を入れる (1 番)
273 と 82 を入れる (2 番)
723、8、22 が見つかった。答えは 2 番と 3 番

Python

def two_sum(nums, target):
    seen = {}
    for i, x in enumerate(nums):
        need = target - x
        if need in seen:
            return [seen[need], i]
        seen[x] = i

print(*two_sum([3, 8, 2, 7], 9))

実行した出力

2 3

要点 ハッシュマップは、探す手間を O(n) から平均 O(1) に変える代わりに、O(n) の記憶を使います。時間と記憶の交換です。Python の dict のキーには list を使えません。JavaScript の Map は、オブジェクトを中身ではなく参照で比べます。

面接での一言 「ハッシュで探すのは平均 O(1) なので全体で O(n) です。代わりに追加の記憶が O(n) 要ります」と、交換の中身まで言います。

動きで見る ハッシュテーブルに値を入れる動きを見られます。

5. スタックとキュー (お皿と行列)

たとえ スタックは積んだお皿です。取れるのは、いちばん上に最後に置いた 1 枚だけです (後入れ先出し)。キューはレジの行列です。先に並んだ人から順に進みます (先入れ先出し)。

やることPythonJavaScript
スタックに入れるst.append(x)st.push(x)
スタックから出すst.pop()st.pop()
キューに入れるdq.append(x)q.push(x)
キューから出すdq.popleft()q.shift()

Python のキューには、両端の出し入れが O(1) の collections.deque を使います。list の pop(0) は先頭を詰めるので O(n) です。JavaScript の配列の shift も、長い配列では先頭を詰める手間がかかることがあります。

スタックの典型は、括弧の対応を調べる問題です。開き括弧は積み、閉じ括弧が来たら、いちばん上が対応する開き括弧かを見て取り除きます。文字列 ({[]}) の手の順は次の通りです。

手文字することスタックの中 (左が下)
1(積む(
2{積む( {
3[積む( { [
4]上の [ と対応するので取る( {
5}上の { と対応するので取る(
6)上の ( と対応するので取る空

最後にスタックが空なら、全部対応しています。

Python

def is_valid(s):
    pairs = {
        ")": "(",
        "]": "[",
        "}": "{",
    }
    st = []
    for ch in s:
        if ch not in pairs:
            st.append(ch)
        elif not st:
            return False
        elif st.pop() != pairs[ch]:
            return False
    return not st

def show(ok):
    print("ok" if ok else "ng")

show(is_valid("({[]})"))
show(is_valid("(]"))

実行した出力

ok
ng

要点 「直前のものに戻る」「取り消す」が出たらスタックです。最後に空かどうかを確かめ忘れると、開き括弧が余った入力を通してしまいます。キューは、次の節の幅優先探索の部品です。

面接での一言 「各文字を積むか取るかの 1 回だけなので O(n)、最悪は全部積むので記憶も O(n) です」と言います。

動きで見る スタックとキューの出し入れを見られます。

6. 再帰と木 (自分を呼ぶ関数と枝分かれ)

たとえ 会社の組織図で、社長が「自分の部下に同じ質問をして、その答えを足して」と頼み、部下もさらに自分の部下に同じ頼みをします。いちばん下の人は部下がいないので、すぐ答えます。この「同じことを小さい形に頼む」のが再帰です。

再帰を書く手順は 3 つです。1 つ目は、これ以上小さくできない形の答えを決める (終わりの条件)。2 つ目は、自分より小さい問題を自分で呼ぶ。3 つ目は、その答えから自分の答えを組み立てる。木は「子の木が、また木」という形なので、再帰とよく合います。

次の木で、根から葉までの深さ (段の数) を求めます。

  • 1 (根)
    • 左の子 2
      • 左の子 4
    • 右の子 3

深さは、1 + (左の深さと右の深さの大きいほう) です。子がいない所は 0 を返します。呼んだ関数が答えを返す順は次の通りです。

呼ぶ点左の深さ右の深さ戻り値
4001
2102
3001
1213

Python

class Node:
    def __init__(self, v,
                 l=None, r=None):
        self.v = v
        self.l = l
        self.r = r

def depth(node):
    if node is None:
        return 0
    return 1 + max(depth(node.l),
                   depth(node.r))

left = Node(2, Node(4))
tree = Node(1, left, Node(3))
print(depth(tree))

実行した出力

3

要点 終わりの条件を先に書きます。無いと自分を呼び続けて止まりません。Python は既定で約 1,000 段までの再帰で止まります。深い木では、繰り返しに書き換えるか、上限を調べてから使います。

面接での一言 「全部の点を 1 回ずつ見るので O(n) です。記憶は再帰の深さ、つまり木の高さ h の分で O(h) です」と言います。

動きで見る 階乗の再帰と、二分探索木の動きを見られます。

8. 動的計画法 (途中の答えをメモ)

たとえ 階段を 1 段か 2 段ずつ登るとき、5 段目への登り方は、4 段目から 1 段登る場合と、3 段目から 2 段登る場合の合計です。4 段目と 3 段目の答えをメモしておけば、同じ計算を繰り返さずに済みます。

段の数登り方の通り数式
111 段だけ
221 段 + 1 段、または 2 段
332 段の 2 + 1 段の 1
453 段の 3 + 2 段の 2
584 段の 5 + 3 段の 3
6135 段の 8 + 4 段の 5

動的計画法 (DP) の作り方は 3 つの手順です。1 つ目は、小さい問題を決める (何段目までの通り数)。2 つ目は、小さい問題の答えから大きい問題の答えを出す式を書く。3 つ目は、小さい順に表を埋める。

Python

def climb(n):
    dp = [1, 1]
    for i in range(2, n + 1):
        dp.append(dp[-1] + dp[-2])
    return dp[n]

print(climb(6))

実行した出力

13

メモの効き目は、関数を呼んだ回数で見えます。次のコードは、同じ式を、メモ無しの再帰とメモ有りの再帰で解き、25 段目の通り数と、関数を呼んだ回数を並べます。2 行目の左がメモ無し、右がメモ有りの回数です。

Python

calls = [0, 0]
memo = {}

def plain(n):
    calls[0] += 1
    if n <= 1:
        return 1
    a = plain(n - 1)
    return a + plain(n - 2)

def with_memo(n):
    calls[1] += 1
    if n <= 1:
        return 1
    if n not in memo:
        a = with_memo(n - 1)
        b = with_memo(n - 2)
        memo[n] = a + b
    return memo[n]

print(plain(25), with_memo(25))
print(*calls)

実行した出力

121393 121393
242785 49

要点 25 段の通り数を求めるのに、メモ無しの再帰は 242,785 回、メモ有りは 49 回の呼び出しで済みました。同じ小さい問題が何度も出て、大きい問題の答えが小さい問題の答えから決まるなら、DP の出番です。メモ付きの再帰 (上から) と、表を埋める繰り返し (下から) は、どちらも同じ小問題を 1 回だけ解きます。手間は、小問題の数に、1 つの小問題あたりの手間を掛けたものです。

面接での一言 「小問題は n 個で、1 つあたり足し算 1 回なので O(n) です。表は直前の 2 つだけ使うので、変数 2 つに減らして記憶は O(1) にもできます」と言います。

よくある問い

計算量とは何ですか

入力の大きさ n が増えたときに、手間 (時間計算量) や記憶 (空間計算量) がどう増えるかを、式で表したものです。秒数ではなく、増え方を比べます。

O(n) と O(n²) は、どれくらい違いますか

n が 1,000 なら、O(n) は 1,000 回、O(n²) は 100 万回で、1,000 倍の差です。n が 10 万なら 10 万回と 100 億回になり、O(n²) は時間内に終わりません。

二分探索は、なぜ O(log n) ですか

毎回、探す範囲が半分になるからです。n 個から 1 個になるまでに半分にできる回数が、2 を底とする log n です。n が 1,000 なら約 10 回です。

幅優先探索と深さ優先探索は、どう使い分けますか

最短の手数や、近い順の処理は幅優先です。行けるかどうかの確認や、全部の列挙は深さ優先が書きやすい形です。手間はどちらも同じです。

動的計画法と、メモ付きの再帰は同じですか

考え方は同じで、同じ小問題を 1 回だけ解きます。メモ付きの再帰は上から呼びながらメモし、動的計画法の表は下から順に埋めます。

8 つのテーマは、どの順で練習しますか

この頁の番号順がおすすめです。1 から 5 は道具で、6 の再帰と木、7 のグラフ探索、8 の DP は、その道具を組み合わせて使います。1 つずつ、下の問題の一覧から解いてください。

出典と確かめ方

文ゆめさく。公開日 2026 年 10 月 30 日、更新日 2026 年 10 月 30 日。この頁のコードは、Python と Node.js で実際に動かし、出力が上の出力の欄と一致することを確かめています。手間の表の数は、式から計算した値です。「まずこれだけは解く 14 問」の計算量は、標準的な解き方を実際に書いて動かし、入力を 2 倍にしたときの手数と記憶の増え方を数えて確かめました。結果は次の表の通りです。比が 2 に近ければ線形、1 に近ければ一定か対数です。

問題手数の比記憶の比
Two Sum2.002.00
Valid Parentheses2.002.00
Binary Search1.07記憶は増えず
Contains Duplicate2.002.00
Valid Anagram2.001.00
Reverse Linked List2.001.00
Maximum Depth of Binary Tree2.001 本道は 2.00、釣り合った木は 12 から 13
Climbing Stairs2.001.00
Best Time to Buy and Sell Stock2.001.00
Valid Palindrome2.001.00
Longest Substring Without Repeating Characters2.001.16
Merge Two Sorted Lists2.001.00
Number of Islands4.004.00
Group Anagrams2.002.00

Number of Islands は、盤の一辺を 2 倍にしたので、面積が 4 倍になっています。Longest Substring は、文字が 26 種類だけの入力で測ったため、記憶が頭打ちになっています。Group Anagrams は、単語の数を 2 倍にしたときの比で、1 語の長さを 8 から 16 にすると、並べ替えの比較の回数は 2.68 倍です。L log L から求めた 2.67 倍とほぼ一致しました。

出典は次の通りです。

  • Python の仕様は、collections.deque と list の計算量の表を参照しました
  • 「まずこれだけは解く 14 問」の番号と題は、英語の問題集の公開の API (leetcode.com/graphql) で 2026 年 10 月 30 日に取った値です。14 問とも、無料のアカウントで開けるものでした
  • JavaScript の仕様は、MDN の Map と Array.prototype.sort を参照しました

次の一歩

表を読んだだけでは、手は動くようになりません。8 つのうち 1 つのテーマを選んで、日本語のコーディング面接問題を 1 問、自分で書いてみてください。英語の問題集で試したくなったら、LeetCodeを日本語で始めるに、同じ型の問題を並べています。面接の前に何から準備するかが分からない人は、転職診断で次にやることを 1 つ決められます。