Bird
Raised Fist0
DSA Rustprogramming~5 mins

Why Greedy Works and When It Fails in DSA Rust - Quick Recap

Choose your learning style10 modes available
Recall & Review
beginner
What is the main idea behind the greedy algorithm approach?
Greedy algorithms make the best choice at each step, hoping to find the overall best solution by building it piece by piece.
Click to reveal answer
intermediate
What does it mean for a problem to have the 'greedy choice property'?
It means that a locally optimal choice at each step leads to a globally optimal solution.
Click to reveal answer
intermediate
Why can greedy algorithms fail on some problems?
Because some problems require considering future consequences, and greedy choices might lead to suboptimal overall results.
Click to reveal answer
beginner
Give an example of a problem where greedy algorithms work perfectly.
The activity selection problem, where choosing the earliest finishing activity first leads to the maximum number of activities selected.
Click to reveal answer
intermediate
Give an example of a problem where greedy algorithms fail to find the best solution.
The coin change problem with non-standard coin denominations, where greedy choice does not always give the minimum number of coins.
Click to reveal answer
What is a key requirement for a greedy algorithm to guarantee an optimal solution?
AThe problem must be solved using recursion
BThe problem must have the greedy choice property
CThe problem must have overlapping subproblems
DThe problem must be solved using dynamic programming
Which problem is a classic example where greedy algorithms work well?
AActivity selection problem
BLongest common subsequence
C0/1 Knapsack problem
DMatrix chain multiplication
Why might a greedy algorithm fail on the coin change problem with unusual coin denominations?
ABecause greedy does not consider future coin choices
BBecause greedy always picks the smallest coin first
CBecause greedy requires sorting coins in descending order
DBecause greedy only works with infinite coins
What does 'locally optimal choice' mean in greedy algorithms?
AThe worst choice to avoid mistakes
BThe best choice after considering all steps
CThe best choice at the current step
DA random choice to explore options
Which of these is NOT a characteristic of problems suitable for greedy algorithms?
AGreedy choice property
BOptimal substructure
CNo need to reconsider previous choices
DOverlapping subproblems
Explain why greedy algorithms work well for some problems but fail for others.
Think about how making the best choice now might not always lead to the best overall result.
You got /4 concepts.
    Describe the greedy choice property and why it is important for greedy algorithms.
    Focus on how local choices relate to the final solution.
    You got /3 concepts.

      Practice

      (1/5)
      1. What is the main reason a greedy algorithm works correctly for some problems?
      easy
      A. Because it tries all possible solutions and picks the best one
      B. Because choosing the best option at each step leads to an optimal solution
      C. Because it uses recursion to explore all paths
      D. Because it sorts the input data before processing

      Solution

      1. Step 1: Understand greedy choice property

        A greedy algorithm works when making the best local choice at each step leads to a globally optimal solution.
      2. Step 2: Differentiate from other methods

        Unlike exhaustive search or recursion, greedy does not try all solutions but relies on local optimal choices.
      3. Final Answer:

        Because choosing the best option at each step leads to an optimal solution -> Option B
      4. Quick Check:

        Greedy choice property = A [OK]
      Hint: Greedy picks best local choice aiming for global best [OK]
      Common Mistakes:
      • Thinking greedy tries all solutions
      • Confusing greedy with recursion or backtracking
      • Assuming sorting alone makes greedy work
      2. Which of the following Rust code snippets correctly implements a greedy approach to select intervals with earliest finishing time?
      easy
      A. intervals.sort_by_key(|x| x.start); let mut count = 0; let mut last_end = 0; for i in &intervals { if i.end >= last_end { count += 1; last_end = i.start; } }
      B. intervals.sort_by_key(|x| x.end); let mut count = 0; for i in &intervals { count += 1; }
      C. intervals.sort_by_key(|x| x.end); let mut count = 0; let mut last_end = 0; for i in &intervals { if i.start >= last_end { count += 1; last_end = i.end; } }
      D. intervals.sort_by_key(|x| x.start); let mut count = 0; for i in &intervals { if i.start > last_end { count += 1; last_end = i.end; } }

      Solution

      1. Step 1: Identify correct sorting key

        The greedy interval scheduling algorithm sorts intervals by their finishing time (end).
      2. Step 2: Check selection condition and update

        It selects intervals starting after or at the last selected interval's end, updating last_end accordingly.
      3. Final Answer:

        intervals.sort_by_key(|x| x.end); let mut count = 0; let mut last_end = 0; for i in &intervals { if i.start >= last_end { count += 1; last_end = i.end; } } -> Option C
      4. Quick Check:

        Sort by end, pick if start >= last_end = B [OK]
      Hint: Sort by finish time, pick intervals starting after last end [OK]
      Common Mistakes:
      • Sorting by start time instead of end time
      • Updating last_end incorrectly
      • Counting all intervals without condition
      3. Consider the Rust code below that tries to find the minimum number of coins for a given amount using greedy approach with coin denominations [25, 10, 5, 1]. What is the output for amount = 30?
      let coins = [25, 10, 5, 1];
      let mut amount = 30;
      let mut count = 0;
      for &coin in &coins {
          count += amount / coin;
          amount %= coin;
      }
      println!("{}", count);
      medium
      A. 4
      B. 3
      C. 5
      D. 2

      Solution

      1. Step 1: Calculate coins for 25-cent

        30 / 25 = 1 coin, remainder 30 % 25 = 5
      2. Step 2: Calculate coins for 10-cent, 5-cent, 1-cent

        5 / 10 = 0 coins, remainder 5; 5 / 5 = 1 coin, remainder 0; 0 / 1 = 0 coins
      3. Step 3: Sum total coins

        1 (25-cent) + 0 (10-cent) + 1 (5-cent) + 0 (1-cent) = 2 coins
      4. Final Answer:

        2 -> Option D
      5. Quick Check:

        30 = 25 + 5 = 2 coins [OK]
      Hint: Divide amount by largest coin, reduce remainder, sum counts [OK]
      Common Mistakes:
      • Adding coins incorrectly
      • Using wrong coin order
      • Ignoring remainder after division
      4. The following Rust code attempts to solve the coin change problem greedily with coins [10, 6, 1] and amount 12. It outputs the number of coins used. What is the bug?
      let coins = [10, 6, 1];
      let mut amount = 12;
      let mut count = 0;
      for &coin in &coins {
          count += amount / coin;
          amount %= coin;
      }
      println!("{}", count);
      medium
      A. The greedy approach fails to find minimum coins for these denominations
      B. The code has a syntax error in the for loop
      C. The amount variable is not mutable
      D. The coins array is not sorted

      Solution

      1. Step 1: Understand greedy failure for coin set

        Greedy picks 10 once, remainder 2, then two 1 coins = 3 coins total.
      2. Step 2: Check for better solution

        Using two 6 coins gives 12 with only 2 coins, better than greedy's 3.
      3. Step 3: Identify bug

        The bug is greedy approach itself fails to find minimum coins for this coin set.
      4. Final Answer:

        The greedy approach fails to find minimum coins for these denominations -> Option A
      5. Quick Check:

        Greedy fails on non-canonical coins = D [OK]
      Hint: Greedy fails if coin set is non-canonical [OK]
      Common Mistakes:
      • Thinking code syntax is wrong
      • Assuming sorting fixes greedy failure
      • Ignoring greedy algorithm limitations
      5. You want to select activities from a list with start and end times to maximize the number of activities chosen. However, some activities overlap partially. Which approach correctly applies greedy algorithm to solve this, and why might it fail if you choose activities by earliest start time instead of earliest finish time?
      hard
      A. Sort activities by earliest finish time and pick compatible ones; choosing by start time can miss optimal sets
      B. Sort activities by earliest start time and pick all that start earliest; this always works
      C. Pick activities randomly; greedy always finds optimal solution
      D. Sort activities by longest duration and pick those first; this maximizes usage

      Solution

      1. Step 1: Identify correct greedy strategy

        Sorting by earliest finish time ensures maximum remaining time for other activities.
      2. Step 2: Explain failure of sorting by start time

        Choosing by earliest start time can select long activities blocking many others, missing optimal count.
      3. Step 3: Conclude correct approach and failure reason

        Greedy works with earliest finish time sorting; earliest start time sorting may fail to maximize activities.
      4. Final Answer:

        Sort activities by earliest finish time and pick compatible ones; choosing by start time can miss optimal sets -> Option A
      5. Quick Check:

        Earliest finish time sorting = A [OK]
      Hint: Sort by finish time, not start time, to maximize activities [OK]
      Common Mistakes:
      • Assuming earliest start time sorting always works
      • Picking longest duration first
      • Ignoring overlap constraints
      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