Free course · EASY → HARD
Algorithms
200 reusable patterns, each taught twice and then proved in a Rust challenge
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
Binary Search
Exploit a monotone decision boundary, not only a sorted Vec
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