動的配列
連続したメモリと O(1) の添字アクセス——追加・挿入・削除、そしてシフトのコスト。
カリキュラム
ソート、探索、動的計画法、グラフアルゴリズム、定番アルゴリズム問題
動的配列
連続したメモリと O(1) の添字アクセス——追加・挿入・削除、そしてシフトのコスト。
スタック
LIFO — push、pop 操作
単調スタック
スタック内の大小関係を保ち、小さい候補を取り除いて右側で最初に大きくなる値を見つける。
キュー
FIFO — enqueue、dequeue 操作
連結リスト
単方向リスト — ノード、head、next ポインタ
双方向連結リスト
prev + next — O(1) 削除・双方向走査
循環連結リスト
tail.next = head — null の末端がない環
ハッシュテーブル — 分離連鎖
各バケットに連結リストを吊るし、衝突したキーを連鎖させる
ハッシュテーブル — 線形探査
オープンアドレス法:衝突時に後方探査、削除は墓標で印付け
木の基礎
根、子、高さ、そして3つの巡回順序——木を語るための語彙。
二分探索木
順序付き二分木 — 挿入・検索・削除(後続ノードによる置換)
AVL 木
挿入でノードの平衡が崩れたときに回転し、高さの平衡を保つ BST。
赤黒木
再彩色と回転で平衡を保つ——多くの標準ライブラリの裏にある木。
ヒープ
最小ヒープ、最大ヒープ、優先度キュー
トライ木
高速な接頭辞検索
Union-Find
互いに素な集合と経路圧縮
グラフの表現
隣接リスト vs 隣接行列、辺、次数——グラフがどうデータになるか。
バブルソート
比較ベースの単純ソート
選択ソート
最小値を見つけて前方に交換
挿入ソート
ソート済みプレフィックスを構築
マージソート
O(n log n) の安定ソート
クイックソート
分割統治法、ピボット選択
ヒープソート
二分ヒープによるインプレースソート
計数ソート
累積和がカウントを位置に変える
基数ソート
安定なバケツ、比較ゼロ
線形探索
前から後ろへ見つかるまで走査——最も素朴な手法、そして最悪ケース。
二分探索
ソート済みデータの対数探索
二ポインタ
ソート済み配列を内側へ進む2つの添字——ペアの和と縮む区間。
スライディングウィンドウ
列の上で窓を伸縮させ、部分配列の問いに O(n) で答える。
累積和
累計を一度だけ作れば、どの区間和も引き算 1 回で答えられる。
深さ優先探索
スタックを使ったグラフ走査
幅優先探索
キューを使ったグラフ走査
木の巡回
前順・中順・後順——同じ木、3つの訪問順序。
連結成分
DFS/BFS で未訪問ノードを掃き、グラフの島ごとにラベルを付ける。
A* 探索
ヒューリスティック最短経路
Two Sum / 二つの和 (LeetCode #1)
和が target になる二つの要素の添字を求める — 一回走査 + ハッシュマップ
LRU キャッシュ (LeetCode #146)
O(1) の get / put — ハッシュマップと双方向連結リストの連携
雨水を貯める (LeetCode #42)
左右の境界配列を作り、2つの実行中最大値へ縮約して1列ずつ水量を確定する
3Sum / 三つの和 (LeetCode #15)
ソート後に一つ固定し、二つのポインタを内側へ — 重複はスキップ