Free course · EASY → HARD

Algorithms

200 reusable patterns, each taught twice and then proved in a Rust challenge

20 units · 600 lessons · every lesson is open

Linear Scans & State

One pass, explicit state, and the invariants behind later patterns

Hash Maps & Sets

Trade memory for direct membership, grouping, and complement lookup

Prefix Sums & Range Queries

Precompute cumulative information so repeated range work becomes cheap

Two Pointers

Use ordering or a maintained boundary to avoid nested scans

Sliding Window

Maintain exactly the state of one contiguous region

Stack, Queue & Monotonic Patterns

Choose the removal order that matches the dependency

Sorting & Selection

Order everything, or isolate only the rank the problem needs

Linked List Techniques

Rewire ownership-like links without losing the unread suffix

Tree Traversal & BST

Choose traversal order from when a node's result becomes known

Heaps & Streaming

Keep only the next best candidate instead of fully ordering the world

DFS, BFS & Graph Traversal

Represent edges explicitly, then control frontier and visited state

Shortest Paths, MST & Flow

Match edge guarantees to the correct shortest-path or connectivity proof

Backtracking & Exhaustive Search

Build a candidate, reject early, and undo exactly what you changed

Greedy & Interval Methods

Make a locally safe commitment and prove what future choices remain

1D Dynamic Programming

Define one state, its transition, base cases, and evaluation order

2D & Advanced Dynamic Programming

Model two dimensions, intervals, subsets, and compressed state spaces

Tries & String Matching

Respect bytes versus characters, then exploit prefixes and borders

Math, Bits & Combinatorics

Replace simulation with algebraic structure and binary identities

Advanced Data Structures

Compose range, ordering, and decomposition techniques for hard constraints