
コーディング面接で
アルゴリズムのチートシートに、
日本の企業のコーディングテストの形と対策に、
標準入力から
この頁の目次3 項目
難度と出題の頻度の見方
出題の頻度は、海外でよく使われる定番の問題リスト 4 本 (Blind 75、NeetCode 150、Grind 75、LeetCode Top Interview 150) に何本入っているかで、よく出る・ときどき出る・少なめ の 3 段階に分けています。少なめは、
難度の目安
- 型を
1 つ 知っていれば 解ける 基本の 問い。 LeetCode の Easy ほど - 型を
選び、 端の 場合まで 詰めて 解く 問い。 LeetCode の Medium ほど - 型を
組み合わせるか、 計算量を 一段縮める 工夫が 要る 問い。 Medium の 難しい 物と Hard - いく
つもの 操作を 持つ仕組みを、 データの 持ち方から 設計して作る問い
準備の
最優先の 8 問先にここから
木 (DFS と BFS)
深さ優先探索 (DFS) で
二分木の 深さを 求める 二分木の
根から 一番 遠い 葉までの 段の 数を 返す。 左右の 子の 深さを 先に 求めて 1 を 足す、 深さ優先の 再帰の 練習です。 再帰で
2 本の 二分木が 同じか 確かめる 2 本の
二分木を 受け取り、 形も 値も まったく 同じかを 返します。 根を 比べ、 左どうし、 右どうしを 同じ 関数に 任せる、 木の 再帰の いちばん基本の 練習です。 再帰で
二分木を 左右反転する 二分木の
すべての 節で 左の 子と 右の 子を 入れ替え、 鏡に 映した 木を 返します。 下の 木を 先に 反転してから 付け替える、 木の 再帰の 基本の 練習です。 深さ優先探索で
二分木の 根から 葉までの 合計を 調べる 二分木の
根から 葉までの 道で、 値の 合計が 目標の 数に なる物が あるかを 調べる。 残りの 数を 子へ 渡しながら 潜る、 深さ優先の 再帰の 練習です。 再帰で
二分木の いちばん長い道の 長さを 求める 二分木の
中で、 いちばん離れた 2 つの 節を 結ぶ 道の 長さを、 辺の 数で 返します。 下から 高さを 返しながら、 ついでに 最長の 道を 数える、 木の 再帰の 練習です。 再帰で
二分木の 高さが 釣り合っているか 確かめる 二分木の
どの 節でも、 左と 右の 高さの 差が 1 以下かを 返します。 下から 高さを 返し、 崩れを 見つけたら 印を 返して 止める、 木の 再帰の 練習です。 再帰で
二分木の 中に 別の 木と 同じ 部分木が あるか 確かめる 大きい
二分木の どこかの 節から 下が、 小さい 二分木と そっくり 同じかを 返します。 どの 節を 根に するかを 探す再帰と、 2 本の 木が 同じかを 比べる 再帰を 組み合わせる 練習です。 幅優先探索 (BFS) と
キューで 二分木を 段ごとに読む 二分木の
値を、 上の 段から 順に、 段ごとの 並びに まとめて 返す。 待ち行列で 近い 節から 順に 見ていく、 幅優先の 読み方の 練習です。 再帰で
二分探索木の 決まりを 確かめる 二分木が
二分探索木の 決まりを 守っているかを 返します。 親と 子だけを 比べる 落とし穴を 避け、 各節に 入って よい値の 範囲を 上から 渡していく 練習です。 再帰で
二分木の 2 つの 節に いちばん近い 共通の 祖先を探す 二分木の
中の 2 つの 値に ついて、 両方を 下に 持つ節の うち、 いちばん深い節の 値を 返します。 左右の 部分木から 見つけた 物を 上へ 返し、 両側から 返った 所で 答えを 決める 再帰の 練習です。 幅優先探索 (BFS) で
二分木を 右から 見た ときに 見える 節を 並べる 二分木を
右側から 眺めた ときに 見える 節の 値を、 上の 段から 順に 返します。 段ごとに 読む幅優先探索で、 各段の いちばん右の 節を 拾う 練習です。 深さ優先探索で
根からの 道で いちばん 大きい値を 持ち回り、 二分木の よい節を 数える 根から
その 節までの 道に、 その 節より 大きい 値が 1 つも 無い節を 「よい節」と 呼び、 その 数を 返します。 上から 下へ、 ここまでの 最大値を 引数で 渡していく 深さ優先探索の 練習です。 辞書と
再帰で 前順と 中順の 並びから 二分木を 組み直す 二分木を
前順と 中順で たどった 2 つの 並びから、 元の 木を 組み直して 返します。 前順で 根を 決め、 中順で 左右を 分ける 再帰に、 位置を 引く 辞書を 組み合わせて O(n) に する 練習です。 再帰で
二分木の 道の 値の 合計が いちばん 大きくなる 所を探す 二分木の
中で、 節を つないだ道の 値の 合計の うち、 いちばん 大きい 値を 返します。 負の 値の 枝を 切り 捨てながら、 下へ 伸ばせる 片道の 和を 返し、 ついでに 曲がる 道を 比べる 再帰の 練習です。 前順の
走査で 二分木を 文字列に して、 文字列から 同じ木に 組み直す 二分木を
1 本の 文字列に 直す serialize と、 その 文字列から 同じ木を 組み直す deserialize を 書きます。 空の 子にも 印を 付けて 前順で 並べ、 読む ときも 同じ順で 消費する 再帰の 練習です。
- 深さ優先探索 (DFS) で
二分木の 深さを求める二分木の根から一番遠い葉までの段の数を返す。左右の子の深さを先に求めて 1 を足す、深さ優先の再帰の練習です。 - 再帰で
2 本の 二分木が 同じか確かめる2 本の二分木を受け取り、形も値もまったく同じかを返します。根を比べ、左どうし、右どうしを同じ関数に任せる、木の再帰のいちばん基本の練習です。 - 再帰で
二分木を 左右反転する二分木のすべての節で左の子と右の子を入れ替え、鏡に映した木を返します。下の木を先に反転してから付け替える、木の再帰の基本の練習です。 - 深さ優先探索で
二分木の 根から 葉までの 合計を調べる二分木の根から葉までの道で、値の合計が目標の数になる物があるかを調べる。残りの数を子へ渡しながら潜る、深さ優先の再帰の練習です。 - 再帰で
二分木の いちばん長い 道の 長さを求める二分木の中で、いちばん離れた 2 つの節を結ぶ道の長さを、辺の数で返します。下から高さを返しながら、ついでに最長の道を数える、木の再帰の練習です。 - 再帰で
二分木の 高さが 釣り合っているか確かめる二分木のどの節でも、左と右の高さの差が 1 以下かを返します。下から高さを返し、崩れを見つけたら印を返して止める、木の再帰の練習です。 - 再帰で
二分木の 中に 別の 木と 同じ 部分木が あるか確かめる大きい二分木のどこかの節から下が、小さい二分木とそっくり同じかを返します。どの節を根にするかを探す再帰と、2 本の木が同じかを比べる再帰を組み合わせる練習です。 - 幅優先探索 (BFS) と
キューで 二分木を 段ごとに読む二分木の値を、上の段から順に、段ごとの並びにまとめて返す。待ち行列で近い節から順に見ていく、幅優先の読み方の練習です。 - 再帰で
二分探索木の 決まりを確かめる二分木が二分探索木の決まりを守っているかを返します。親と子だけを比べる落とし穴を避け、各節に入ってよい値の範囲を上から渡していく練習です。 - 再帰で
二分木の 2 つの 節に いちばん近い 共通の 祖先を探す二分木の中の 2 つの値について、両方を下に持つ節のうち、いちばん深い節の値を返します。左右の部分木から見つけた物を上へ返し、両側から返った所で答えを決める再帰の練習です。 - 幅優先探索 (BFS) で
二分木を 右から 見た ときに 見える 節を並べる二分木を右側から眺めたときに見える節の値を、上の段から順に返します。段ごとに読む幅優先探索で、各段のいちばん右の節を拾う練習です。 - 深さ優先探索で
根からの 道で いちばん 大きい値を 持ち回り、 二分木の よい 節を数える根からその節までの道に、その節より大きい値が 1 つも無い節を「よい節」と呼び、その数を返します。上から下へ、ここまでの最大値を引数で渡していく深さ優先探索の練習です。 - 辞書と
再帰で 前順と 中順の 並びから 二分木を組み直す二分木を前順と中順でたどった 2 つの並びから、元の木を組み直して返します。前順で根を決め、中順で左右を分ける再帰に、位置を引く辞書を組み合わせて O(n) にする練習です。 - 再帰で
二分木の 道の 値の 合計が いちばん 大きくなる所を探す二分木の中で、節をつないだ道の値の合計のうち、いちばん大きい値を返します。負の値の枝を切り捨てながら、下へ伸ばせる片道の和を返し、ついでに曲がる道を比べる再帰の練習です。 - 前順の
走査で 二分木を 文字列に して、 文字列から 同じ木に組み直す二分木を 1 本の文字列に直す serialize と、その文字列から同じ木を組み直す deserialize を書きます。空の子にも印を付けて前順で並べ、読むときも同じ順で消費する再帰の練習です。
海外の
そろった問題 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) で 出し入れと 無作為な 取り出しが できる 集合を作る
解いた
言葉で