Признак в условии
- «максимум / минимум», и локально лучший выбор не мешает будущему
- задачи про прыжки, покрытие, расписание, размен при «правильных» номиналах
- часто после сортировки становится очевидно
Идея
На каждом шаге берём лучшее прямо сейчас и не пересматриваем. Работает, только если у задачи есть свойство жадного выбора. Проверяй контрпримером: для размена монетами [1, 3, 4] и суммы 6 жадность даст 3 монеты вместо 2 - здесь нужна динамика.
Шаблон
let reach = 0;
for (let i = 0; i < nums.length; i++) {
if (i > reach) return false; // проверка ДО обновления
reach = Math.max(reach, i + nums[i]);
}
return true;
Сложность
Обычно O(n) или O(n log n) с сортировкой, память O(1).
Частые ошибки
- жадность применяется там, где нужна динамика - всегда ищи контрпример
- проверка выполняется после обновления состояния
- забыта сортировка, без которой жадный выбор неверен
Мнемоника
«Лучшее сейчас - и не оглядываться»
Не путать с
- Динамическое программирование - прежде чем брать жадность, попробуй найти контрпример вслух. Не нашёл - говори «жадно, потому что…»; нашёл - динамика
- Интервалы - классическая жадность на отрезках: сортируем по концу и берём первый подходящий
Задачи на этот паттерн
- можно ли дойти до конца
- лучшая сделка
- круговой маршрут
- разбиение строки на части