At each step, pick the locally best choice and never look back. Works when local optimal = global optimal.
Each cell = max jump length. Greedily track max reachable index. If current > max_reach, we're stuck!
| Greedy Works | Use DP Instead |
|---|---|
| Activity selection (end time) | 0/1 Knapsack |
| Interval merging | Subset sum |
| Fractional Knapsack | Longest path in graph |
| Jump Game I | Edit distance |
| Minimum spanning tree | Matrix chain multiplication |
# Jump Game — track max reachable def can_jump(nums): max_reach = 0 for i, jump in enumerate(nums): if i > max_reach: return False # stuck! max_reach = max(max_reach, i + jump) return True # Merge Intervals — sort by start def merge(intervals): intervals.sort() merged = [intervals[0]] for start, end in intervals[1:]: if start <= merged[-1][1]: # overlaps merged[-1][1] = max(merged[-1][1], end) else: merged.append([start, end]) return merged # Gas Station — circular greedy def can_complete_circuit(gas, cost): total = cur = start = 0 for i in range(len(gas)): diff = gas[i] - cost[i] total += diff; cur += diff if cur < 0: start = i + 1; cur = 0 return start if total >= 0 else -1