TechLead
Advanced
25 min
Full Guide

Greedy Algorithms

Greedy approach, optimization problems, and when to use greedy

Greedy Algorithms

Greedy algorithms make locally optimal choices at each step, hoping to find a global optimum. They're faster than DP but don't always give the optimal solution.

Activity Selection Problem

function activitySelection(activities) {
  // Sort by finish time
  activities.sort((a, b) => a.end - b.end);
  
  const selected = [activities[0]];
  let lastEnd = activities[0].end;
  
  for (let i = 1; i < activities.length; i++) {
    if (activities[i].start >= lastEnd) {
      selected.push(activities[i]);
      lastEnd = activities[i].end;
    }
  }
  return selected;
}

Coin Change (Greedy - not always optimal)

function coinChangeGreedy(coins, amount) {
  coins.sort((a, b) => b - a); // Descending
  const result = [];
  
  for (const coin of coins) {
    while (amount >= coin) {
      result.push(coin);
      amount -= coin;
    }
  }
  return amount === 0 ? result : null;
}

// Works for standard coin systems (1, 5, 10, 25)
// May not work for arbitrary coin systems!

Fractional Knapsack

function fractionalKnapsack(items, capacity) {
  // Sort by value/weight ratio

  

  items.sort((a, b) => (b.value / b.weight) - (a.value / a.weight));
  
  let totalValue = 0;
  
  for (const item of items) {
    if (capacity >= item.weight) {
      totalValue += item.value;
      capacity -= item.weight;
    } else {
      totalValue += item.value * (capacity / item.weight);
      break;
    }
  }
  return totalValue;
}

Greedy vs DP: Greedy: Fast, locally optimal | DP: Slower, globally optimal. Use greedy when problem has greedy-choice property.