Why Greedy Works and When It Fails in DSA Javascript - Performance Analysis
We want to understand how fast greedy algorithms run and why their speed depends on the problem.
When does greedy give a quick solution, and when does it take longer or fail?
Analyze the time complexity of this greedy approach for the coin change problem.
function greedyCoinChange(coins, amount) {
let count = 0;
for (let coin of coins) {
while (amount >= coin) {
amount -= coin;
count++;
}
}
return count;
}
This code tries to make change by always picking the largest coin first until the amount is zero or no coins fit.
Look at the loops and repeated steps.
- Primary operation: The inner while loop subtracting coins from amount.
- How many times: Up to the total amount divided by the smallest coin value.
As the amount grows, the number of subtractions grows roughly in proportion.
| Input Size (amount) | Approx. Operations |
|---|---|
| 10 | About 10 subtractions |
| 100 | About 100 subtractions |
| 1000 | About 1000 subtractions |
Pattern observation: The work grows roughly linearly with the amount size.
Time Complexity: O(m + n / c)
This means the time grows linearly with the number of coin types (m) and the amount divided by the smallest coin value (n/c).
[X] Wrong: "Greedy always finds the best answer quickly."
[OK] Correct: Sometimes greedy picks local best choices that don't lead to the overall best solution, causing failure or longer work.
Understanding when greedy works helps you explain your approach clearly and choose the right method in real problems.
"What if the coins array is not sorted largest to smallest? How would the time complexity and correctness change?"
Practice
Solution
Step 1: Understand greedy choice property
A greedy algorithm picks the best option at each step without reconsidering previous choices.Step 2: Connect greedy choice to global optimum
This local best choice leads to a global optimum only if the problem has the greedy choice property.Final Answer:
Because it makes the best choice at each step hoping for a global optimum -> Option AQuick Check:
Greedy choice property = best local choice [OK]
- Thinking greedy tries all solutions
- Confusing greedy with recursion
- Assuming sorting always solves the problem
arr?Solution
Step 1: Identify standard loop for arrays
The standard way to loop over array elements by index isfor (let i = 0; i < arr.length; i++).Step 2: Check other options
while (arr.length)loops infinitely unless modified;for...inloops keys, not values;forEachis valid but less common for greedy step control.Final Answer:
for (let i = 0; i < arr.length; i++) {} -> Option CQuick Check:
Standard for loop = for (let i = 0; i < arr.length; i++) {} [OK]
- Using for...in for arrays (loops keys)
- Using while without proper exit
- Confusing forEach with for loop syntax
const intervals = [[1,4],[2,3],[3,5]];
intervals.sort((a,b) => a[1] - b[1]);
const result = [];
let lastEnd = 0;
for (const [start, end] of intervals) {
if (start >= lastEnd) {
result.push([start, end]);
lastEnd = end;
}
}
console.log(result);Solution
Step 1: Sort intervals by finish time
Sorted intervals: [[2,3],[1,4],[3,5]] because 3 < 4 < 5.Step 2: Select intervals greedily
Start with lastEnd=0. Check [2,3]: 2 >= 0, select it, lastEnd=3. Next [1,4]: 1 < 3, skip. Next [3,5]: 3 >= 3, select it, lastEnd=5.Final Answer:
[[2,3],[3,5]] -> Option DQuick Check:
Greedy interval selection = [[2,3],[3,5]] [OK]
- Not sorting intervals by finish time
- Selecting overlapping intervals
- Updating lastEnd incorrectly
const coins = [4, 3, 1];
let amount = 6;
let count = 0;
for (const coin of coins) {
while (amount >= coin) {
amount -= coin;
count++;
}
}
console.log(count);Solution
Step 1: Trace greedy coin selection
Greedy picks 4 once (amount=2), then picks 1 twice (amount=0), total 3 coins.Step 2: Check optimal solution
Optimal is 2 coins: 3 + 3 = 6, fewer than greedy's 3 coins.Final Answer:
It outputs 3 but the minimum coins needed is 2 -> Option AQuick Check:
Greedy fails for coin sets without canonical property [OK]
- Assuming greedy always gives minimum coins
- Not checking smaller coin combinations
- Ignoring coin order importance
[[0, 30], [5, 10], [15, 20]]. Which approach correctly applies greedy algorithm and what is the maximum number of meetings?Solution
Step 1: Sort meetings by finish time
Sorted: [5,10], [15,20], [0,30] (finish times 10, 20, 30).Step 2: Select meetings greedily
Pick [5,10], next [15,20] starts after 10, pick it; [0,30] overlaps, skip.Final Answer:
Sort by finish time, pick earliest finish; maximum meetings = 2 -> Option BQuick Check:
Greedy by finish time = 2 meetings [OK]
- Sorting by start time instead of finish time
- Assuming shortest duration always works
- Counting overlapping meetings
Ready to prove it?
Pass the test and this pattern moves unknown
