
This course includes our updated coding exercises so you can practice your skills as you learn.
See a demo
Master JavaScript algorithms and data structures by exploring Big O notation and the performance of arrays and objects. Delve into recursion, searching and sorting, data structures, graphs, and Dijkstra's algorithm.
Jump around course by following prerequisites at the start of each section, using big O and recursion guidance, and study topics like bubble sort, merge sort, and binary heaps.
Practice a browser-based JavaScript workflow using Chrome snippets to run code without installing software, exploring console logs and data structures like binary search trees and breadth-first search.
Explore the need for big O notation and its role in measuring time, space complexity, and logarithm, then learn how to compare algorithms, discuss trade-offs, and prepare for interviews.
Compare two approaches to summing 1 to n, an iterative for loop and a formula n(n+1)/2, and discuss timing challenges, benchmarking pitfalls, and the rise of Big O notation.
Count the number of simple operations to compare code performance instead of time, showing how operation counts grow with input size and relate to Big O notation.
Visualize time complexities by plotting execution time for two algorithms as pn grows. Compare add up to first, which scales with mn, to add up to second, which remains constant.
Learn how big O describes how input growth affects runtime, from constant to linear and quadratic cases, with examples like count up and down and print all pairs.
Simplify big O expressions by focusing on broad trends, discarding constants and smaller terms, and using rules of thumb to compare O(n), O(1), and O(n^2) growth.
Master space complexity in JavaScript by analyzing auxiliary space and constant vs linear growth. See how strings, arrays, and objects affect memory as input scales.
Master logarithms and their role in big o time complexity, focusing on log n growth and its advantage over n and n^2. See their impact in searching, sorting, and recursion.
Apply big O analysis to basic JavaScript arrays and objects, examining insertion costs, why adding to the beginning is costly, and runtime implications of built-in methods.
Explore JavaScript objects as unordered key-value stores with constant-time insertion, access, update, and removal, and learn how hashing underpins their performance; searching and the keys/values/entries methods scale to O(n).
Compare JavaScript arrays and objects through Big O, highlighting arrays' ordered index-based access and how insertion at the beginning or end affects performance, using push, pop, shift, and unshift.
Explore the time complexity of array methods: push and pop are constant time; shift, unshift, slice, splice, and map, filter, reduce run in O(n), with sort at O(n log n).
Master problem solving with a two-part approach: build a solid plan and learn common patterns like frequency counters, two pointers, and divide and conquer, tailored for interview-ready algorithms.
Develop problem solving skills by following five steps to understand the problem, identify inputs and outputs, restate the task, label data, and explore examples.
Explore concrete examples to clarify the problem, define inputs and outputs, and test edge cases, invalid inputs, and casing decisions for a char count function.
Break down problems by writing a concise step plan and communicate it in interviews. Sketch a function skeleton, loop over the string, and return an object counting alphanumeric lowercase characters.
Master a five-step problem solving approach: understand, test with examples, plan steps, then solve or simplify. Build a string character counter using an object, alphanumeric filtering, and lowercase handling.
Review and refactor your solution by examining results, exploring alternative approaches, and balancing efficiency with readability. Compare methods, improve performance considerations, and reflect on coding style and interview best practices.
Outline a five-step protocol for interview-ready problem solving: understand the problem, explore inputs and edge cases, plan with pseudocode and think out loud, then solve and refactor.
Plan before coding by applying common problem solving patterns. Learn the frequency counter pattern and other approaches like divide and conquer and greedy methods to tackle real coding challenges.
Learn the frequency counter pattern by building two frequency maps to compare values and their frequencies, enabling linear-time solutions for problems like squared values and anagrams.
Leads learners through implementing valid anagram checks with a frequency counter, comparing two lowercase words for identical character counts, and includes hands-on exercises and walkthroughs.
Builds a frequency counter from the first string and, after checking equal lengths, subtracts counts using the second string to verify anagrams in O(n) time, without nested loops.
Master the multiple pointers pattern by using two indices in a sorted array to find the first pair that sums to zero, with a linear-time two-pointer approach.
Apply the two-pointer approach to count unique values in a sorted array, possibly storing the unique values at the beginning to return the count in one pass.
Learn a two-pointer solution to count unique values in a sorted array. Implement i and j pointers to compress duplicates, achieve linear time, and handle the empty array case.
Explore the sliding window pattern to solve continuous-subset problems in arrays and strings, including finding the longest unique-string segment and the maximum sum of n consecutive elements, with linear-time solutions.
Master the divide and conquer pattern, from linear search to binary search, and explore sorting algorithms like merge sort and quicksort on sorted data.
Explore recursion through a storytelling approach that clarifies iterative vs recursive solutions, defines the base case, and explains the call stack, helper method versus pure recursion, with challenges to practice.
Define recursion as a function that calls itself, explain why it matters in JavaScript, and show how JSON parsing, DOM traversal, and tree or graph algorithms benefit from it.
Explore how JavaScript manages function calls with the call stack. See how functions push and pop on the stack, including recursive calls, and observe a step-by-step debugging example.
Learn to write your first recursive function with a base case that ends recursion and a recursive step that handles smaller input, as shown in a countdown.
Explore a second recursive function, some range, with base case NUM equals 1. Observe how it adds num to the range until it sums to 6 or 10.
Learn to compute factorial iteratively with a for loop, using a total that starts at one and multiplies by i down to two, then contrast with the recursive version.
Write a recursive factorial function that returns num times factorial of num minus one, using a base case at one to stop recursion.
Explore common recursion pitfalls, including missing or incorrect base cases and failing to return a value, which trigger maximum call stack size exceeded or stack overflow in examples like factorial.
Explore helper method recursion, with an outer function and a nested recursive helper that updates a shared result array, explains base cases, and collects odd values in an array.
Explore pure recursion to extract odd values from an array without mutating the original, using concatenate to accumulate results and return a single combined array.
learn the fundamentals of searching algorithms in javascript, implement linear and binary search on arrays, and explore string searching including the naive and amp string searching methods.
Explore how linear search scans an array by checking each element until a match is found and its index is returned. Note how indexOf, includes, and find embody it.
Implement a linear search function that takes an array and a value, loops through to find a match, and returns the index or negative one; time complexity is O(n).
Explore the time complexity of linear search, covering best, worst, and average cases, and understand why it operates in O(n) for unsorted data.
Explore binary search, a fast algorithm for sorted arrays that halves the search space at each step by comparing a middle element and guiding left or right, outperforming linear search.
Write a binary search function in pseudocode for a sorted number array. Use left and right pointers and a middle value to guide comparisons and return the index or -1.
Implement a binary search on a sorted array by maintaining start, end, and middle indices, updating bounds based on comparisons, and returning index when found or -1 when not present.
Analyze binary search time complexity on a sorted array, noting best case O(1) and worst/average case O(log n), and explain how log base 2 affects step counts.
Explore naive string search to count occurrences of a smaller pattern in a longer string using nested loops and a simple string search function that returns the count.
Implement a naive string search in JavaScript by looping the long string with a nested short pattern loop, using index sums to compare and count full matches.
Updated with a brand new section on Dynamic Programming!
This course crams months of computer science and interview prep material into 20 hours of video. The content is based directly on the last semester of my in-person coding bootcamps, where my students go on to land 6-figure developer jobs. I cover the exact same computer science content that has helped my students ace interviews at huge companies like Google, Tesla, Amazon, and Facebook. Nothing is watered down for an online audience; this is the real deal :) We start with the basics and then eventually cover “advanced topics” that similar courses shy away from like Heaps, Graphs, and Dijkstra’s Shortest Path Algorithm.
I start by teaching you how to analyze your code’s time and space complexity using Big O notation. We cover the ins and outs of Recursion. We learn a 5-step approach to solving any difficult coding problem. We cover common programming patterns. We implement popular searching algorithms. We write 6 different sorting algorithms: Bubble, Selection, Insertion, Quick, Merge, and Radix Sort. Then, we switch gears and implement our own data structures from scratch, including linked lists, trees, heaps, hash tables, and graphs. We learn to traverse trees and graphs, and cover Dijkstra's Shortest Path Algorithm. The course also includes an entire section devoted to Dynamic Programming.
Here's why this course is worth your time:
It's interactive - I give you a chance to try every problem before I show you my solution.
Every single problem has a complete solution walkthrough video as well as accompanying solution file.
I cover helpful "tips and tricks" to solve common problems, but we also focus on building an approach to ANY problem.
It's full of animations and beautiful diagrams!
Are you looking to level-up your developer skills? Sign up today!