
コーディング面接で
アルゴリズムのチートシートに、
日本の企業のコーディングテストの形と対策に、
標準入力から
この頁の目次3 項目
難度と出題の頻度の見方
出題の頻度は、海外でよく使われる定番の問題リスト 4 本 (Blind 75、NeetCode 150、Grind 75、LeetCode Top Interview 150) に何本入っているかで、よく出る・ときどき出る・少なめ の 3 段階に分けています。少なめは、
難度の目安
- 型を
1 つ 知っていれば 解ける 基本の 問い。 LeetCode の Easy ほど - 型を
選び、 端の 場合まで 詰めて 解く 問い。 LeetCode の Medium ほど - 型を
組み合わせるか、 計算量を 一段縮める 工夫が 要る 問い。 Medium の 難しい 物と Hard - いく
つもの 操作を 持つ仕組みを、 データの 持ち方から 設計して作る問い
準備の
最優先の 8 問先にここから
動的計画法 (DP)
動的計画法
(DP) で 階段の 上り方を 数える 1 段か
2 段ずつ 上る とき、 n 段の 階段の 上り方が 何通り あるかを 数える。 小さな 段の 答えを 覚えて 使い回す、 動的計画の 最初の 練習です。 動的計画法で
通行料つきの 階段を いちばん 安く上る 段ごとに
決まった 通行料を 払うと、 そこから 1 段か 2 段上れる 階段で、 いちばん上へ 抜けるまでの 合計を 最も 安くします。 前の 2 段の 答えだけを 持ち歩く、 階段の 数え方の 続きの 練習です。 動的計画法で
碁盤の 目の 左上から 右下への 道順を 数える 碁盤の
目の 町を、 右か下へ 1 マスずつだけ 進んで 左上から 右下へ 行く 道順が 何通り あるかを 数えます。 上と 左の マスの 答えを 足して 表を 埋める、 2 次元の 動的計画の 入口の 練習です。 動的計画法で
最大部分配列和を 求める 整数の
並びから、 続いた 区間の 合計の うち最大の 値を 求める。 「ここで 終わる 区間の 最大」を 1 つ 持ち 歩き、 並びを 1 回なめるだけで 解く 考え方の 練習です。 動的計画法で
隣り合わない 要素の 合計を 最大にする 日ごとの
稼ぎの 並びから、 続けて 2 日は 選ばない 決まりで 合計の 最大を 求める。 各日で 「選ぶ」 「選ばない」の 2 通りを 比べて 表を 埋める、 動的計画の 練習です。 動的計画法
(DP) で おつりの 硬貨の 枚数を 最も 少なくする 何種類かの
硬貨を 何枚でも 使える とき、 ちょうど ある 金額を 作るのに 要る 最も 少ない 枚数を 求める。 大きい 硬貨から 取る 欲張りは 外れる ことが あり、 小さい 金額の 答えを 順に 積み上げる DP で 解きます。 動的計画法で
輪に なった 並びから 隣り合わない合計を 最大にする 日ごとの
稼ぎの 予定が 輪のように 繰り返し、 最後の 日と 最初の 日も 隣どうしに なる とき、 続けて 2 日は 選ばない 決まりで 合計の 最大を 求めます。 輪を 2 本の まっすぐな 並びに 分け、 同じ表の 埋め方を 2 回使う 練習です。 動的計画法で
2 つの 文字列に 共通する 最長の 部分列を 求める 2 つの
文字列から、 順番を 変えずに 文字を 拾って 作れる 共通の 並びの うち、 いちばん長い物の 長さを 求めます。 2 つの 文字列の 前から 何文字かずつを 表の 縦と 横に 取り、 欄を 順に 埋める 動的計画の 練習です。 部分和の
数え上げで 符号の 付け方を 数える 数の
並びの それぞれに + か - を 付けて 足した とき、 ちょうど 目標に なる 付け方が 何通り あるかを 数えます。 符号の 付け方の 問題を 「和が ある 数に なる 選び方の 数」に 言い換え、 1 次元の 表で 数える 練習です。 動的計画法で
硬貨の 組み合わせが 何通り あるかを 数える 何種類かの
硬貨を 何枚でも 使える とき、 ちょうど ある 金額に なる 組み合わせが 何通り あるかを 数えます。 並べる 順の 違いを 数えないために、 硬貨の 繰り返しを 外側に 置く 理由まで つかむ 練習です。 動的計画法で
文字列を 辞書の 単語に 区切れるか 調べる 空白の
抜けた 文字列を、 辞書に ある 単語だけで 区切れるかを 調べます。 「前から 何文字目までなら 区切れるか」を 表に 書き、 欲張りで 外れる 場合も 取り こぼさない 動的計画の 練習です。 動的計画法で
数字だけの 暗号を 文字に 戻す読み方を 数える A を
1、 B を 2、…、 Z を 26 と 置き換えて 区切りを 消した 数字の 列が、 何通りの 文字の 並びに 読めるかを 数えます。 最後の 1 桁か 2 桁で 場合を 分け、 前の 2 つの 答えを 足していく 練習です。 動的計画法で
最大と 最小の 積を 持ち 歩き、 積が 最大の 続いた 区間を 求める 負の
数と 0 を 含む 整数の 並びから、 続いた 区間の 積の うち最も 大きい値を 求めます。 負の 数を 掛けると 大小が 入れ替わるので、 そこで 終わる 区間の 最大と 最小を 2 つ 並べて 持ち歩く 練習です。 動的計画法で
売った 次の 日は 買えない 決まりの 売り 買いの 利益を 最大にする 毎日の
値段の 並びで、 何回でも 売り 買いできるが 売った 次の 日は 休む 決まりの とき、 利益の 最大を 求めます。 持っている、 今日 売った、 休んでいるの 3 つの 状態を 日ごとに 持ち歩く 練習です。 動的計画法
(DP) と 二分探索で 最長の 増える 部分列を 求める 整数の
並びから、 順を 保ったまま 飛び飛びに 選んで、 どんどん 大きくなる 数の 列を 作る とき、 その 最も 長い 長さを 求める。 O(n²) の DP から 入り、 長さごとの 「最も 小さい 末尾」を 二分探索で 直す O(n log n) に 縮めます。 動的計画法で
2 つの 単語の 編集距離を 求める 1 文字の
挿入、 削除、 置き換えを 何回すれば、 ある 単語を 別の 単語に 変えられるかの 最小を 求めます。 2 次元の 表で 考え、 記憶を 表の 1 行分まで 縮める ところまで 詰める 練習です。 0-1 ナップサックで
荷物を 同じ 重さの 2 組に 分ける 荷物の
重さの 並びを、 重さの 合計が 同じ 2 組に 分けられるかを 調べます。 「半分の 重さちょうどの 選び方が あるか」に 言い換え、 1 次元の 表を 後ろから 埋める 0-1 ナップサックの 練習です。 動的計画法で
2 つの 文字列を 順を 保って 混ぜると 3 つ目に なるか 調べる 2 つの
文字列の 文字を、 それぞれの 順を 変えずに 交互に 混ぜて 3 つ目の 文字列が 作れるかを 確かめます。 2 つの 文字列から 使った 文字数を 表の 縦と 横に 取り、 作れる 所を 埋めていく 練習です。 動的計画法で
低い マスから 順に 埋め、 グリッドの 上り続ける 最長の 道を 求める 高さの
書かれた グリッドを、 上下左右の 隣へ 高さが 上がり続けるように 進むとき、 通れる マスの 数の 最大を 求めます。 低い マスから 順に 「そこで 終わる 道の 長さ」を 決めていく 練習です。 動的計画法で
文字列から 別の 文字列を 拾い出す方法を 数える 文字列 s から、
順番を 変えずに 文字を 拾って 文字列 t を 作る 拾い方が 何通り あるかを 数えます。 t の 前から 何文字までを 作ったかごとの 数を、 s の 文字を 1 つずつ 読みながら 更新する 練習です。 区間の
動的計画法で 最後に 割る 風船を 決め、 得点の 合計を 最大にする 並んだ
風船を 1 つずつ 割り、 割った 風船と 左右の 隣の 数の 積を 得点に する とき、 合計の 最大を 求めます。 区間の 中で 「最後に 割る 風船」を 決めて、 左右を 別々の 小さな 区間に 分ける 練習です。 動的計画法で
ドットと アスタリスクの 入った 型が 文字列全体に 合うか 調べる 「どの
1 文字でも よい」の ドットと 「直前の 1 文字を 0 回以上くり返す」の アスタリスクを 使った 型が、 文字列の 全体に 合うかを 確かめます。 文字列と 型の 前から 何文字ずつが 合うかを 表に して 埋める 練習です。
- 動的計画法 (DP) で
階段の 上り方を数える1 段か 2 段ずつ上るとき、n 段の階段の上り方が何通りあるかを数える。小さな段の答えを覚えて使い回す、動的計画の最初の練習です。 - 動的計画法で
通行料つきの 階段を いちばん安く上る段ごとに決まった通行料を払うと、そこから 1 段か 2 段上れる階段で、いちばん上へ抜けるまでの合計を最も安くします。前の 2 段の答えだけを持ち歩く、階段の数え方の続きの練習です。 - 動的計画法で
碁盤の 目の 左上から 右下への 道順を数える碁盤の目の町を、右か下へ 1 マスずつだけ進んで左上から右下へ行く道順が何通りあるかを数えます。上と左のマスの答えを足して表を埋める、2 次元の動的計画の入口の練習です。 - 動的計画法で
最大部 分配列和を求める整数の並びから、続いた区間の合計のうち最大の値を求める。「ここで終わる区間の最大」を 1 つ持ち歩き、並びを 1 回なめるだけで解く考え方の練習です。 - 動的計画法で
隣り合わない 要素の 合計を 最大にする日ごとの稼ぎの並びから、続けて 2 日は選ばない決まりで合計の最大を求める。各日で「選ぶ」「選ばない」の 2 通りを比べて表を埋める、動的計画の練習です。 - 動的計画法 (DP) で
おつりの 硬貨の 枚数を 最も 少なくする何種類かの硬貨を何枚でも使えるとき、ちょうどある金額を作るのに要る最も少ない枚数を求める。大きい硬貨から取る欲張りは外れることがあり、小さい金額の答えを順に積み上げる DP で解きます。 - 動的計画法で
輪に なった 並びから 隣り合わない 合計を 最大にする日ごとの稼ぎの予定が輪のように繰り返し、最後の日と最初の日も隣どうしになるとき、続けて 2 日は選ばない決まりで合計の最大を求めます。輪を 2 本のまっすぐな並びに分け、同じ表の埋め方を 2 回使う練習です。 - 動的計画法で
2 つの 文字列に 共通する 最長の 部分列を求める2 つの文字列から、順番を変えずに文字を拾って作れる共通の並びのうち、いちばん長い物の長さを求めます。2 つの文字列の前から何文字かずつを表の縦と横に取り、欄を順に埋める動的計画の練習です。 - 部分和の
数え上げで 符号の 付け方を数える数の並びのそれぞれに + か - を付けて足したとき、ちょうど目標になる付け方が何通りあるかを数えます。符号の付け方の問題を「和がある数になる選び方の数」に言い換え、1 次元の表で数える練習です。 - 動的計画法で
硬貨の 組み合わせが 何通り あるかを数える何種類かの硬貨を何枚でも使えるとき、ちょうどある金額になる組み合わせが何通りあるかを数えます。並べる順の違いを数えないために、硬貨の繰り返しを外側に置く理由までつかむ練習です。 - 動的計画法で
文字列を 辞書の 単語に 区切れるか調べる空白の抜けた文字列を、辞書にある単語だけで区切れるかを調べます。「前から何文字目までなら区切れるか」を表に書き、欲張りで外れる場合も取りこぼさない動的計画の練習です。 - 動的計画法で
数字だけの 暗号を 文字に 戻す読み方を数えるA を 1、B を 2、…、Z を 26 と置き換えて区切りを消した数字の列が、何通りの文字の並びに読めるかを数えます。最後の 1 桁か 2 桁で場合を分け、前の 2 つの答えを足していく練習です。 - 動的計画法で
最大と 最小の 積を 持ち 歩き、 積が 最大の 続いた 区間を求める負の数と 0 を含む整数の並びから、続いた区間の積のうち最も大きい値を求めます。負の数を掛けると大小が入れ替わるので、そこで終わる区間の最大と最小を 2 つ並べて持ち歩く練習です。 - 動的計画法で
売った 次の 日は 買えない 決まりの 売り 買いの 利益を 最大にする毎日の値段の並びで、何回でも売り買いできるが売った次の日は休む決まりのとき、利益の最大を求めます。持っている、今日売った、休んでいるの 3 つの状態を日ごとに持ち歩く練習です。 - 動的計画法 (DP) と
二分 探索で 最長の 増える 部分列を求める整数の並びから、順を保ったまま飛び飛びに選んで、どんどん大きくなる数の列を作るとき、その最も長い長さを求める。O(n²) の DP から入り、長さごとの「最も小さい末尾」を二分探索で直す O(n log n) に縮めます。 - 動的計画法で
2 つの 単語の 編集距離を求める1 文字の挿入、削除、置き換えを何回すれば、ある単語を別の単語に変えられるかの最小を求めます。2 次元の表で考え、記憶を表の 1 行分まで縮めるところまで詰める練習です。 - 0-1 ナップサックで
荷物を 同じ 重さの 2 組に分ける荷物の重さの並びを、重さの合計が同じ 2 組に分けられるかを調べます。「半分の重さちょうどの選び方があるか」に言い換え、1 次元の表を後ろから埋める 0-1 ナップサックの練習です。 - 動的計画法で
2 つの 文字列を 順を 保って 混ぜると 3 つ目に なるか調べる2 つの文字列の文字を、それぞれの順を変えずに交互に混ぜて 3 つ目の文字列が作れるかを確かめます。2 つの文字列から使った文字数を表の縦と横に取り、作れる所を埋めていく練習です。 - 動的計画法で
低い マスから 順に 埋め、 グリッドの 上り続ける 最長の 道を求める高さの書かれたグリッドを、上下左右の隣へ高さが上がり続けるように進むとき、通れるマスの数の最大を求めます。低いマスから順に「そこで終わる道の長さ」を決めていく練習です。 - 動的計画法で
文字列から 別の 文字列を 拾い出す方法を数える文字列 s から、順番を変えずに文字を拾って文字列 t を作る拾い方が何通りあるかを数えます。t の前から何文字までを作ったかごとの数を、s の文字を 1 つずつ読みながら更新する練習です。 - 区間の
動的計画法で 最後に 割る 風船を 決め、 得点の 合計を 最大にする並んだ風船を 1 つずつ割り、割った風船と左右の隣の数の積を得点にするとき、合計の最大を求めます。区間の中で「最後に割る風船」を決めて、左右を別々の小さな区間に分ける練習です。 - 動的計画法で
ドットと アスタリスクの 入った 型が 文字列全体に 合うか調べる「どの 1 文字でもよい」のドットと「直前の 1 文字を 0 回以上くり返す」のアスタリスクを使った型が、文字列の全体に合うかを確かめます。文字列と型の前から何文字ずつが合うかを表にして埋める練習です。
海外の
そろった問題 149 / 150 問。準備中の
配列とハッシュ9 / 9 問
ツーポインタ5 / 5 問
スライディングウィンドウ6 / 6 問
スタック7 / 7 問
二分探索7 / 7 問
連結リスト11 / 11 問
- 35連結リストの
つなぎ先を 付け替えて 逆順にする - 36ダミーの
節で 2 本の 並んだ 連結リストを 1 本にまとめる - 37半分に
分けて 後ろを 逆にし、 連結リストを 前と 後ろから 互い 違いに並べ直す - 38間を
あけた 2 本の 指で 連結リストの 後ろから n 番目の節を外す - 39元の
節と 写しの 対応表で random つきの 連結リストを 丸ごと写す - 40繰り
上がりを 持ちながら、 1 の 位から 並んだ 2 本の 連結リストの数を足す - 41速い指と
遅い指で 連結リストの 輪を見つける - 42速い指と
遅い指で 並びの 中の 重なった数を探す - 43辞書と
双方 向リストで LRU キャッシュを設計する - 442 本ずつまとめて
k 本の 並んだ 連結リストを 1 本にする - 45つなぎ先の
付け替えで 連結リストを k 個ずつ逆順にする
木15 / 15 問
- 46再帰で
二分木を 左右反転する - 47深さ優先探索 (DFS) で
二分木の 深さを求める - 48再帰で
二分木の いちばん長い 道の 長さを求める - 49再帰で
二分木の 高さが 釣り合っているか確かめる - 50再帰で
2 本の 二分木が 同じか確かめる - 51再帰で
二分木の 中に 別の 木と 同じ 部分木が あるか確かめる - 52二分探索木の
大小で 2 つの 節の 共通の 祖先を探す - 53幅優先探索 (BFS) と
キューで 二分木を 段ごとに読む - 54幅優先探索 (BFS) で
二分木を 右から 見た ときに 見える 節を並べる - 55深さ優先探索で
根からの 道で いちばん 大きい値を 持ち回り、 二分木の よい 節を数える - 56再帰で
二分探索木の 決まりを確かめる - 57スタックの
中順の 走査で 二分探索木の k 番目に 小さい値を探す - 58辞書と
再帰で 前順と 中順の 並びから 二分木を組み直す - 59再帰で
二分木の 道の 値の 合計が いちばん 大きくなる所を探す - 60前順の
走査で 二分木を 文字列に して、 文字列から 同じ木に組み直す
トライ木3 / 3 問
ヒープ7 / 7 問
バックトラック9 / 9 問
グラフ12 / 13 問
- 80幅優先探索 (BFS) で
グリッドの 島を数える - 81幅優先探索 (BFS) と
辞書で つながりの グラフを写し取る - 82深さ優先探索 (DFS) で
グリッドの いちばん 大きい島の 広さを求める - 83幅優先探索 (BFS) で
東と 西の 両方の 海へ 流れる 場所を探す - 84盤の
端から たどって 囲まれた 空き地だけを埋める - 85幅優先探索 (BFS) で
知らせが 全員に 届くまでの 分を数える - 86幅優先探索 (BFS) で
全部の 部屋から いちばん近い 出口までの 歩数を求める - 87トポロジカルソートで
全部の 講座を 受けられるか調べる - 88トポロジカルソートと
ヒープで 講座を 受ける 順を決める - 89素集合 (Union-Find) で
木に 1 本だけ足された 余分な 道を見つける - 90つながった組の数準備中
- 91幅優先探索 (BFS) の
色塗りで、 つながった 2 人を 別の 組に 分けられるか調べる - 92幅優先探索 (BFS) で
言葉の 梯子の いちばん短い 長さを求める
グラフの応用6 / 6 問
1 次元の動的計画法12 / 12 問
- 99動的計画法 (DP) で
階段の 上り方を数える - 100動的計画法で
通行料つきの 階段を いちばん安く上る - 101動的計画法で
隣り合わない 要素の 合計を 最大にする - 102動的計画法で
輪に なった 並びから 隣り合わない 合計を 最大にする - 103まん中から
広げて 最も 長い 回文の 部分文字列を探す - 104まん中から
広げて 回文に なっている 部分文字列を 全部数える - 105動的計画法で
数字だけの 暗号を 文字に 戻す読み方を数える - 106動的計画法 (DP) で
おつりの 硬貨の 枚数を 最も 少なくする - 107動的計画法で
最大と 最小の 積を 持ち 歩き、 積が 最大の 続いた 区間を求める - 108動的計画法で
文字列を 辞書の 単語に 区切れるか調べる - 109動的計画法 (DP) と
二分 探索で 最長の 増える 部分列を求める - 1100-1 ナップサックで
荷物を 同じ 重さの 2 組に分ける
2 次元の動的計画法11 / 11 問
- 111動的計画法で
碁盤の 目の 左上から 右下への 道順を数える - 112動的計画法で
2 つの 文字列に 共通する 最長の 部分列を求める - 113動的計画法で
売った 次の 日は 買えない 決まりの 売り 買いの 利益を 最大にする - 114動的計画法で
硬貨の 組み合わせが 何通り あるかを数える - 115部分和の
数え上げで 符号の 付け方を数える - 116動的計画法で
2 つの 文字列を 順を 保って 混ぜると 3 つ目に なるか調べる - 117動的計画法で
低い マスから 順に 埋め、 グリッドの 上り続ける 最長の 道を求める - 118動的計画法で
文字列から 別の 文字列を 拾い出す方法を数える - 119動的計画法で
2 つの 単語の 編集距離を求める - 120区間の
動的計画法で 最後に 割る 風船を 決め、 得点の 合計を 最大にする - 121動的計画法で
ドットと アスタリスクの 入った 型が 文字列全体に 合うか調べる
貪欲法8 / 8 問
区間6 / 6 問
数学と幾何8 / 8 問
ビット演算7 / 7 問
そのほかの問題22 問
- ランレングス圧縮で
続く 同じ 文字を縮める - 割り算と
余りで 整数が 回文かを確かめる - 文字列の
単語を 逆順に 並べ替える - ハッシュで
最初の 重複しない 文字を探す - ツーポインタで
0 を 配列の 末尾へ移す - ソートと
ツーポインタで 目標に いちばん近い 3 つの 和を求める - 3 本の
指で 0 と 1 と 2 の 並びを 1 回で 並べ替える - ソートと
ツーポインタで 和が 目標に なる 4 つの 組を 全部集める - スライディングウィンドウで
続いた 1 の 最長を数える - スライディングウィンドウで
幅 k の 平均が 最大の所を探す - 再帰で
入れ子の 配列を 平らにする - 二分探索で
挿入位置を求める - 二分探索で
同じ 値が 続く 範囲の 両端を探す - 二分探索で
上って 下る 並びの 頂上を探す - 深さ優先探索で
二分木の 根から 葉までの 合計を調べる - 再帰で
二分木の 2 つの 節に いちばん近い 共通の 祖先を探す - 再帰で
並びから 高さの そろった 二分探索木を作る - 繰り返しで
二分探索木に 新しい 値を 葉として足す - 再帰で
二分探索木から 値を 消して 木を つなぎ直す - 幅優先探索 (BFS) で
グリッドの 最短の 道を数える - 素集合 (Union-Find) で
つながった 町の まとまりを数える - 辞書と
並びを 組み合わせて O(1) で 出し入れと 無作為な 取り出しが できる 集合を作る
解いた
言葉で