Bird
Raised Fist0
DSA Typescriptprogramming~5 mins

Memoization Top Down DP in DSA Typescript - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is memoization in the context of dynamic programming?
Memoization is a technique where we store the results of expensive function calls and reuse them when the same inputs occur again, avoiding repeated calculations.
Click to reveal answer
intermediate
How does top-down dynamic programming differ from bottom-up?
Top-down DP uses recursion with memoization to solve problems by breaking them into smaller subproblems and storing results. Bottom-up DP solves subproblems iteratively from smallest to largest without recursion.
Click to reveal answer
beginner
In TypeScript, how can you implement memoization for a Fibonacci function?
You can use a Map or object to store computed Fibonacci values. Before computing a value, check if it exists in the map. If yes, return it; if no, compute and store it.
Click to reveal answer
intermediate
Why is memoization useful in recursive algorithms?
Memoization prevents repeated calculations of the same subproblems, reducing exponential time complexity to polynomial time, making recursive algorithms efficient.
Click to reveal answer
intermediate
What is a common mistake when implementing memoization in top-down DP?
A common mistake is not storing the result before returning it, which causes repeated calculations and defeats memoization's purpose.
Click to reveal answer
What does memoization store to optimize recursive calls?
AAll function calls
BInput parameters only
CRandom values
DResults of subproblems
Which data structure is commonly used in TypeScript for memoization?
AArray only
BMap or object
CSet
DQueue
Top-down DP with memoization is best described as:
AIterative with caching
BIterative without caching
CRecursive with caching
DRecursive without caching
What happens if you forget to store results in memoization?
AThe algorithm runs slower due to repeated calculations
BThe algorithm runs faster
CThe algorithm crashes
DThe algorithm uses less memory
Memoization changes the time complexity of naive recursion from:
AExponential to polynomial
BPolynomial to exponential
CLinear to exponential
DConstant to linear
Explain how memoization works in top-down dynamic programming with an example.
Think about how you avoid repeating the same calculation.
You got /4 concepts.
    Describe the benefits and potential pitfalls of using memoization in recursive algorithms.
    Consider both speed and memory trade-offs.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the main purpose of memoization in top-down dynamic programming?
      easy
      A. To reduce the memory usage by deleting variables
      B. To sort the input data before processing
      C. To convert recursive code into iterative code
      D. To store results of subproblems to avoid repeated calculations

      Solution

      1. Step 1: Understand memoization concept

        Memoization saves the results of subproblems so they are not recalculated.
      2. Step 2: Compare options

        Only To store results of subproblems to avoid repeated calculations correctly describes this purpose; others describe unrelated actions.
      3. Final Answer:

        To store results of subproblems to avoid repeated calculations -> Option D
      4. Quick Check:

        Memoization = store subproblem results [OK]
      Hint: Memoization caches answers to reuse later [OK]
      Common Mistakes:
      • Confusing memoization with sorting
      • Thinking memoization reduces memory by deleting variables
      • Believing memoization converts recursion to iteration
      2. Which of the following is the correct TypeScript syntax to declare a memo object for caching number results indexed by number keys?
      easy
      A. const memo: Record = {};
      B. const memo: Array<number> = [];
      C. const memo: Map = new Map();
      D. const memo: Set<number> = new Set();

      Solution

      1. Step 1: Identify memo type for number keys and values

        Memo should map number keys to number values, so Record fits.
      2. Step 2: Check other options

        Array is indexed by number but not key-value pairs; Map uses string keys here; Set stores unique values, not key-value pairs.
      3. Final Answer:

        const memo: Record = {}; -> Option A
      4. Quick Check:

        Memo object with number keys and values = Record [OK]
      Hint: Use Record for number-keyed memo objects [OK]
      Common Mistakes:
      • Using Map with wrong key/value types
      • Using Set which stores only values, not key-value pairs
      • Using Array when keys are not continuous indexes
      3. Consider the following TypeScript code using memoization for Fibonacci numbers:
      function fib(n: number, memo: Record = {}): number {
        if (n <= 1) return n;
        if (memo[n]) return memo[n];
        memo[n] = fib(n - 1, memo) + fib(n - 2, memo);
        return memo[n];
      }
      console.log(fib(5));

      What is the output of this code?
      medium
      A. Undefined
      B. 5
      C. 3
      D. 8

      Solution

      1. Step 1: Trace fib(5) calls with memoization

        fib(5) = fib(4) + fib(3), fib(4) = fib(3) + fib(2), fib(3) = fib(2) + fib(1), fib(2) = fib(1) + fib(0). Values: fib(0)=0, fib(1)=1.
      2. Step 2: Calculate values bottom-up

        fib(2)=1, fib(3)=2, fib(4)=3, fib(5)=5.
      3. Final Answer:

        5 -> Option B
      4. Quick Check:

        fib(5) = 5 [OK]
      Hint: Remember fib(5) = 5 in Fibonacci sequence [OK]
      Common Mistakes:
      • Confusing fib(5) with fib(6)
      • Forgetting base cases fib(0)=0 and fib(1)=1
      • Assuming memo[n] is undefined for n=1
      4. The following TypeScript function attempts to use memoization for factorial calculation but has a bug:
      function factorial(n: number, memo: Record = {}): number {
        if (n === 0) return 1;
        if (memo[n]) return memo[n];
        memo[n] = n * factorial(n - 1, memo);
        return memo[n];
      }

      What is the bug in this code?
      medium
      A. It incorrectly checks memo[n] which fails for factorial(0)
      B. It does not handle the base case correctly
      C. It uses the wrong multiplication operator
      D. It does not pass memo object in recursive calls

      Solution

      1. Step 1: Analyze memo[n] check for zero value

        When n=0, factorial is 1, but memo[0] is undefined initially. The check if(memo[n]) fails for memo[0] = 0 or 1 because 0 or 1 are falsy/truthy but memo[0] might be undefined.
      2. Step 2: Identify correct memo check

        Checking if(memo[n]) fails if memo[n] is 0 or falsy. Should check if(n in memo) instead to detect cached values correctly.
      3. Final Answer:

        It incorrectly checks memo[n] which fails for factorial(0) -> Option A
      4. Quick Check:

        Check memo keys with 'in' operator, not truthy check [OK]
      Hint: Use 'n in memo' to check cache, not 'if(memo[n])' [OK]
      Common Mistakes:
      • Assuming memo[n] check works for zero or falsy values
      • Missing base case for n=0
      • Not passing memo in recursive calls
      5. You want to optimize a function that counts the number of ways to climb n stairs taking 1 or 2 steps at a time using top-down memoization. Which of the following TypeScript implementations correctly applies memoization to avoid repeated calculations?
      hard
      A. function climbStairs(n: number, memo: Record = {}): number { if (n <= 1) return 1; if (memo[n]) return memo[n]; memo[n] = climbStairs(n - 1, memo) + climbStairs(n - 2, memo); return memo[n]; }
      B. function climbStairs(n: number): number { if (n <= 1) return 1; return climbStairs(n - 1) + climbStairs(n - 2); }
      C. function climbStairs(n: number, memo: Record = {}): number { if (n <= 1) return 1; if (memo[n] !== undefined) return memo[n]; memo[n] = climbStairs(n - 1, memo) + climbStairs(n - 2, memo); return memo[n]; }
      D. function climbStairs(n: number, memo: Record = {}): number { if (n <= 1) return 1; if (memo[n] === 0) return memo[n]; memo[n] = climbStairs(n - 1, memo) + climbStairs(n - 2, memo); return memo[n]; }

      Solution

      1. Step 1: Check memoization condition correctness

        function climbStairs(n: number, memo: Record = {}): number { if (n <= 1) return 1; if (memo[n] !== undefined) return memo[n]; memo[n] = climbStairs(n - 1, memo) + climbStairs(n - 2, memo); return memo[n]; } uses 'memo[n] !== undefined' to check cache, which correctly handles zero or falsy values.
      2. Step 2: Compare other options

        function climbStairs(n: number, memo: Record = {}): number { if (n <= 1) return 1; if (memo[n]) return memo[n]; memo[n] = climbStairs(n - 1, memo) + climbStairs(n - 2, memo); return memo[n]; } uses 'if(memo[n])' which fails if memo[n] is 0; function climbStairs(n: number): number { if (n <= 1) return 1; return climbStairs(n - 1) + climbStairs(n - 2); } has no memoization; function climbStairs(n: number, memo: Record = {}): number { if (n <= 1) return 1; if (memo[n] === 0) return memo[n]; memo[n] = climbStairs(n - 1, memo) + climbStairs(n - 2, memo); return memo[n]; } checks 'memo[n] === 0' which misses other cached values.
      3. Final Answer:

        Option C correctly applies memoization with proper cache check -> Option C
      4. Quick Check:

        Use '!== undefined' to check memo cache [OK]
      Hint: Check cache with '!== undefined' to handle all values [OK]
      Common Mistakes:
      • Using 'if(memo[n])' which fails for zero values
      • Not passing memo in recursive calls
      • Not using memoization at all
      Recommended

      Ready to prove it?

      Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard