Bird
Raised Fist0
DSA Cprogramming~10 mins

Why Greedy Works and When It Fails in DSA C - Why It Works

Choose your learning style10 modes available
Concept Flow - Why Greedy Works and When It Fails
Start Problem
↓
Choose Best Local Option
↓
Is This Choice Feasible?
No→Backtrack or Fail
Yes↓
Add Choice to Solution
↓
Is Problem Fully Solved?
No→Repeat Choose Best Local Option
Yes↓
Return Solution
The greedy method picks the best local choice at each step, checks if it's allowed, adds it, and repeats until the problem is solved or fails.
Execution Sample
DSA C
int greedy_example(int arr[], int n) {
  int sum = 0;
  for (int i = 0; i < n; i++) {
    if (arr[i] > 0) sum += arr[i];
  }
  return sum;
}
This code sums all positive numbers in an array by greedily adding only positive values.
Execution Table
StepOperationCurrent ElementDecisionSum So FarReasoning
1Check arr[0]3Add 333 > 0, add to sum
2Check arr[1]-1Skip3-1 <= 0, skip
3Check arr[2]4Add 474 > 0, add to sum
4Check arr[3]0Skip70 <= 0, skip
5Check arr[4]2Add 292 > 0, add to sum
6End--9All elements processed
💡 All elements checked, sum of positive numbers is 9
Variable Tracker
VariableStartAfter Step 1After Step 2After Step 3After Step 4After Step 5Final
sum0337799
i0123455
Key Moments - 3 Insights
Why does greedy sometimes fail to find the best solution?
Because greedy only looks at the best immediate choice without considering future consequences, it can miss better overall solutions. See execution_table step 2 where skipping negative is good here, but in other problems, a local best choice might block better future options.
When is greedy guaranteed to work?
Greedy works when the problem has the 'greedy choice property' and 'optimal substructure', meaning local best choices lead to global best. The execution_table shows a simple sum where adding positive numbers always helps.
What happens if the greedy choice is not feasible?
The flow in concept_flow shows that if a choice is not feasible, the algorithm must backtrack or fail. Greedy algorithms usually do not backtrack, so they fail or give suboptimal results if feasibility is violated.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the sum after checking the third element?
A3
B7
C9
D4
💡 Hint
Check the 'Sum So Far' column at Step 3 in the execution_table.
At which step does the algorithm skip adding the element because it is not positive?
AStep 2
BStep 3
CStep 4
DStep 5
💡 Hint
Look at the 'Decision' column in execution_table for when 'Skip' happens.
If the array had a negative number that must be included for a better total, what would happen to the greedy approach?
AIt would still find the best solution
BIt would fail or give a suboptimal solution
CIt would backtrack to include the negative number
DIt would ignore all positive numbers
💡 Hint
Refer to key_moments about greedy failing when local best choices block better future solutions.
Concept Snapshot
Greedy Algorithm:
- Pick best local choice each step
- Check if choice is feasible
- Add choice to solution
- Repeat until done
- Works if problem has greedy choice property
- May fail if future consequences ignored
Full Transcript
The greedy algorithm solves problems by choosing the best option available at each step without reconsidering past choices. It checks if the choice is allowed, adds it to the solution, and repeats until the problem is solved or no choices remain. This works well when the problem has special properties ensuring local best choices lead to a global best solution. However, greedy can fail if it ignores future consequences, leading to suboptimal results. The example code sums positive numbers by greedily adding only positive values. The execution table shows step-by-step how the sum changes. Key moments explain why greedy sometimes fails and when it works. The quiz tests understanding of the execution steps and greedy limitations.

Practice

(1/5)
1. What is the main reason a greedy algorithm works correctly for some problems?
easy
A. Because it makes the best choice at each step hoping for a global optimum
B. Because it tries all possible solutions and picks the best one
C. Because it uses recursion to explore all options
D. Because it sorts the input data before processing

Solution

  1. Step 1: Understand greedy choice property

    A greedy algorithm picks the best option available at the current step without reconsidering previous choices.
  2. Step 2: Connect greedy choice to global optimum

    For some problems, making the best local choice at each step leads to the best overall solution.
  3. Final Answer:

    Because it makes the best choice at each step hoping for a global optimum -> Option A
  4. Quick Check:

    Greedy choice property = Because it makes the best choice at each step hoping for a global optimum [OK]
Hint: Greedy picks best local choice hoping for best overall [OK]
Common Mistakes:
  • Thinking greedy tries all solutions
  • Confusing greedy with recursion or backtracking
  • Assuming sorting alone makes greedy correct
2. Which of the following is the correct syntax to pick the next item greedily from a sorted array arr in C?
easy
A. int next = arr[--i];
B. int next = arr[i]; i++;
C. int next = arr[++i];
D. int next = arr[i]; i--;

Solution

  1. Step 1: Understand post-increment vs pre-increment

    Post-increment i++ returns current value then increments; pre-increment ++i increments then returns.
  2. Step 2: Choose syntax that picks current item then moves forward

    int next = arr[i]; i++; picks current element and then increments index for next pick.
  3. Final Answer:

    int next = arr[i]; i++; -> Option B
  4. Quick Check:

    Pick current then increment index = int next = arr[i]; i++; [OK]
Hint: Pick current element then increment index separately [OK]
Common Mistakes:
  • Using pre-increment which skips first element
  • Decrementing index instead of incrementing
  • Confusing post-increment inside array index
3. Consider the following C code that tries to select intervals greedily by earliest finish time:
typedef struct {
  int start;
  int end;
} Interval;

int main() {
  Interval arr[] = {{1,4}, {3,5}, {0,6}, {5,7}, {8,9}};
  int n = 5, count = 0, last_end = 0;
  for (int i = 0; i < n; i++) {
    if (arr[i].start >= last_end) {
      count++;
      last_end = arr[i].end;
    }
  }
  printf("%d\n", count);
  return 0;
}
What is the output?
medium
A. 3
B. 4
C. 5
D. 2

Solution

  1. Step 1: Trace interval selection without sorting

    Intervals are checked in given order: {1,4}, {3,5}, {0,6}, {5,7}, {8,9}. - Pick {1,4} (start 1 >= 0), count=1, last_end=4 - {3,5} start 3 < 4 skip - {0,6} start 0 < 4 skip - {5,7} start 5 >= 4 pick, count=2, last_end=7 - {8,9} start 8 >= 7 pick, count=3, last_end=9
  2. Step 2: Check if output matches options

    Count is 3, but 2 is 2, so check carefully: initial last_end=0, first interval start=1 >=0 pick count=1 Second interval start=3 < 4 skip Third start=0 < 4 skip Fourth start=5 >=4 pick count=2 Fifth start=8 >=7 pick count=3 Output is 3
  3. Final Answer:

    3 -> Option A
  4. Quick Check:

    Greedy without sorting picks 3 intervals [OK]
Hint: Without sorting, greedy may pick fewer intervals [OK]
Common Mistakes:
  • Assuming intervals are sorted by end time
  • Counting all intervals without checking overlap
  • Confusing start and end comparisons
4. The following code tries to solve the coin change problem greedily by picking the largest coin first. What is the bug?
int coins[] = {25, 10, 5, 1};
int amount = 30, count = 0;
for (int i = 0; i < 4; i++) {
  while (amount >= coins[i]) {
    amount -= coins[i];
    count++;
  }
}
printf("%d\n", count);
medium
A. The coin array is not sorted in descending order
B. The amount variable should be reset inside the loop
C. Greedy fails for some amounts, so this may not give minimum coins
D. The loop should run backwards from smallest coin

Solution

  1. Step 1: Understand greedy coin change approach

    The code picks largest coin repeatedly until amount is reduced, then moves to smaller coins.
  2. Step 2: Identify when greedy fails

    Greedy works for US coins but fails for some coin sets or amounts (e.g., coins {10,6,1} and amount 12). Here, greedy may not minimize coin count.
  3. Final Answer:

    Greedy fails for some amounts, so this may not give minimum coins -> Option C
  4. Quick Check:

    Greedy coin change can fail minimum count [OK]
Hint: Greedy coin change not always minimal [OK]
Common Mistakes:
  • Thinking sorting fixes greedy failure
  • Changing loop direction without reason
  • Resetting amount inside loop incorrectly
5. You want to schedule the maximum number of non-overlapping meetings from this list:
struct Meeting { int start; int end; };
Meeting meetings[] = {{0,10}, {1,3}, {4,5}};
int n = 3;
Which approach guarantees the maximum meetings scheduled and why does a greedy approach based on earliest start time fail here?
hard
A. Sort by longest duration and pick greedily; shortest duration fails because it picks too many meetings
B. Sort by earliest start time and pick greedily; earliest finish time fails because it ignores start times
C. Pick meetings randomly; sorting is not needed for maximum scheduling
D. Sort by earliest finish time and pick greedily; earliest start time fails because it may pick long meetings blocking others

Solution

  1. Step 1: Identify correct greedy strategy for interval scheduling

    Sorting meetings by earliest finish time and picking those that start after last chosen meeting's end maximizes count.
  2. Step 2: Explain why earliest start time fails

    Picking by earliest start time may select long meetings first, blocking many others, reducing total count.
  3. Final Answer:

    Sort by earliest finish time and pick greedily; earliest start time fails because it may pick long meetings blocking others -> Option D
  4. Quick Check:

    Earliest finish time sorting = max meetings [OK]
Hint: Sort by finish time, not start time, for max meetings [OK]
Common Mistakes:
  • Sorting by start time only
  • Ignoring meeting durations
  • Assuming random picks work
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