
コーディング面接で
アルゴリズムのチートシートに、
日本の企業のコーディングテストの形と対策に、
標準入力から
この頁の目次3 項目
難度と出題の頻度の見方
出題の頻度は、海外でよく使われる定番の問題リスト 4 本 (Blind 75、NeetCode 150、Grind 75、LeetCode Top Interview 150) に何本入っているかで、よく出る・ときどき出る・少なめ の 3 段階に分けています。少なめは、
難度の目安
- 型を
1 つ 知っていれば 解ける 基本の 問い。 LeetCode の Easy ほど - 型を
選び、 端の 場合まで 詰めて 解く 問い。 LeetCode の Medium ほど - 型を
組み合わせるか、 計算量を 一段縮める 工夫が 要る 問い。 Medium の 難しい 物と Hard - いく
つもの 操作を 持つ仕組みを、 データの 持ち方から 設計して作る問い
準備の
最優先の 8 問先にここから
二分探索
二分探索で
ソート 済み配列から 値を探す 小さい
順に 並んだ 整数から 目当ての 数の 位置を 探し、 無ければ -1 を 返す。 探す範囲を 毎回 半分に 狭める 二分探索の 練習です。 二分探索で
挿入位置を 求める 小さい
順の 並びで、 目当ての 数が あれば その 位置を、 無ければ 順を 崩さずに 入れる 位置を 返す。 二分探索が 止まった ときの 左の 端が 何を 指すかを 考える 練習です。 答えの
値で 二分探索して 締め切りに 間に 合う 最小の 速さを探す 何冊かの
本を 決まった 時間で 読み切るのに 要る、 1 時間 あたりの 最小の ページ 数を 返します。 並びではなく 答えの 値の 範囲を 半分ずつ 絞る、 二分探索の 使い方の 練習です。 二分探索で
同じ値が 続く 範囲の 両端を探す 小さい
順に 並んだ 整数の 並びから、 目標の 値が 続いている 範囲の 最初と 最後の 位置を 返します。 「この 値以上が 始まる 位置」を 探す 二分探索を 2 回使い、 端の 場合まで 詰める 練習です。 二分探索で
上って 下る 並びの 頂上を探す 上ってから
下る 整数の 並びから、 いちばん高い 所 (頂上) の 位置を 返します。 並び全体が 小さい 順でなくても、 隣と 比べた 向きで 範囲を 半分に 絞れる ことに 気づく 練習です。 二分探索で
行ごとに 並んだ 表から 値を探す 各行が
小さい 順に 並び、 行の 頭が 前の 行の 最後より 大きい 表から、 目標の 値が あるかを 返します。 表を 1 本の 長い 並びと 見なして 二分探索する 練習です。 二分探索で
回された 並びの いちばん 小さい 値を探す 小さい
順の 並びを 途中で 切って 前後を 入れ替えた 並びから、 いちばん 小さい 値を O(log n) で 返します。 まん中と 右端を 比べて、 切れ目の ある 側へ 絞る 二分探索の 練習です。 二分探索で
回された 並びから 値を探す 小さい
順の 並びを 途中で 切って 前後を 入れ替えた 並びから、 目当ての 値の 位置を O(log n) で 探します。 半分に 割る たびに、 どちらの 半分が 順に 並んでいるかを 見分ける 練習です。 二分探索で
2 つの ソート 済み配列の 中央値を 求める 小さい
順の 2 つの 並びを 1 つに まとめずに、 まとめた ときの 中央値を O(log(min(m, n))) で 求めます。 短い方の 並びの 「切る 位置」を 二分探索で 探す練習です。
- 二分探索で
ソート済み配列から値を探す小さい順に並んだ整数から目当ての数の位置を探し、無ければ -1 を返す。探す範囲を毎回半分に狭める二分探索の練習です。 - 二分探索で
挿入位置を求める小さい順の並びで、目当ての数があればその位置を、無ければ順を崩さずに入れる位置を返す。二分探索が止まったときの左の端が何を指すかを考える練習です。 - 答えの
値で 二分 探索して 締め切りに 間に 合う 最小の 速さを探す何冊かの本を決まった時間で読み切るのに要る、1 時間あたりの最小のページ数を返します。並びではなく答えの値の範囲を半分ずつ絞る、二分探索の使い方の練習です。 - 二分探索で
同じ 値が 続く 範囲の 両端を探す小さい順に並んだ整数の並びから、目標の値が続いている範囲の最初と最後の位置を返します。「この値以上が始まる位置」を探す二分探索を 2 回使い、端の場合まで詰める練習です。 - 二分探索で
上って 下る 並びの 頂上を探す上ってから下る整数の並びから、いちばん高い所 (頂上) の位置を返します。並び全体が小さい順でなくても、隣と比べた向きで範囲を半分に絞れることに気づく練習です。 - 二分探索で
行ごとに 並んだ 表から値を探す各行が小さい順に並び、行の頭が前の行の最後より大きい表から、目標の値があるかを返します。表を 1 本の長い並びと見なして二分探索する練習です。 - 二分探索で
回された 並びの いちばん 小さい値を探す小さい順の並びを途中で切って前後を入れ替えた並びから、いちばん小さい値を O(log n) で返します。まん中と右端を比べて、切れ目のある側へ絞る二分探索の練習です。 - 二分探索で
回された 並びから値を探す小さい順の並びを途中で切って前後を入れ替えた並びから、目当ての値の位置を O(log n) で探します。半分に割るたびに、どちらの半分が順に並んでいるかを見分ける練習です。 - 二分探索で
2 つの ソート済み配列の 中央値を求める小さい順の 2 つの並びを 1 つにまとめずに、まとめたときの中央値を O(log(min(m, n))) で求めます。短い方の並びの「切る位置」を二分探索で探す練習です。
海外の
そろった問題 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) で 出し入れと 無作為な 取り出しが できる 集合を作る
解いた
言葉で