Бесплатная бета: 60 дней полного доступа, без карты.мест осталось: 84Зарегистрироваться бесплатно

Мы используем необходимые куки для работы сайта (вход и язык). Если ты согласишься, мы также загрузим Google Analytics, чтобы видеть, какие страницы читают, и Google reCAPTCHA для защиты форм обратной связи и сообщений об ошибке от спама. Политика конфиденциальности

Все паттерны

Жадный алгоритм (обменный аргумент)

Greedy (exchange argument)

O(n log n)

Берите лучший на вид вариант прямо сейчас и никогда к нему не возвращайтесь. Работает это, только если есть доказательство.

Обновлено 17 окт. 2026 г.

Жадный алгоритм (обменный аргумент): как это работает?

Назовите выбор, который делается на каждом шаге. Обычно это наименьший, наибольший или самый ранний вариант.

Отсортируйте вход так, чтобы этот вариант был впереди. Сортировка и есть основная работа.

Пройдите список один раз и берите всё, что подходит. Не оглядывайтесь на уже сделанный выбор.

Весь приём держится на одном утверждении. Локально лучший выбор не закрывает глобально лучший ответ.

Доказывают это обменом: возьмите любой оптимальный ответ и подставьте свой выбор. Если он остался оптимальным, жадность безопасна.

Без такого доказательства жадность падает молча. Она вернёт правдоподобный ответ, который не лучший.

Источники: Википедия: Жадный алгоритм

  1. по концу: [1,3], [2,4], [3,5]Бронируем встречи. Впереди та, что кончается раньше.
  2. берём [1, 3]Она кончается раньше всех и оставляет больше места.
  3. пропускаем [2, 4]Она начинается в 2, до конца предыдущей.
  4. берём [3, 5]Она начинается ровно тогда, когда комната освободилась.
  5. ответ = 2Помещаются две встречи. Сортировка по длине могла бы потерять одну.
Жадно набрать 18 наименьшим числом монет
minCoinsGreedy([1, 5, 2, 10], 18)
coins
1
5
2
10
amount = 18
used
пусто

Нужно набрать 18 как можно меньшим числом монет. Жадное правило: всегда брать самую крупную монету, которая ещё помещается.

Гонка скорости
Перебор всех подмножеств и жадный выбор на одних и тех же 11 встречах: как уместить больше всего встреч без наложений

Столбики: когда заканчивается каждая встреча, в порядке их начала.

Одна операция: одна проверка встречи или одно сравнение при сортировке. За каждый кадр все дорожки делают одинаковое число операций, поэтому медленная отстаёт.

Перебор всех подмножеств O(2ⁿ·n)
операций: 0
Жадный выбор по времени окончания O(n log n)
операций: 0

 

А если чисел больше

Операции для n чисел и примерное время при 100 миллионах простых операций в секунду. Это оценка по тому же счёту, а не замер.

n = 10
Перебор всех подмножеств2,2 тыс. · меньше 1 мс
Жадный выбор по времени окончания33,3 · меньше 1 мс
n = 20
Перебор всех подмножеств2,2 млн · 22 мс
Жадный выбор по времени окончания80,5 · меньше 1 мс
n = 40
Перебор всех подмножеств2,3 трлн · 6,4 ч
Жадный выбор по времени окончания189 · меньше 1 мс

Жадный алгоритм (обменный аргумент): шаблон кода

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

Жадный алгоритм (обменный аргумент): разбор примера

Наименьшее число стрел для шаров

Шары занимают горизонтальные отрезки. Стрела, выпущенная в точке x, лопает все шары, накрывающие x.

Верните наименьшее число стрел, лопающих все шары.

Отсортируйте шары по правому краю.

Стреляйте в первый правый край и пропускайте все накрытые шары. Потом стреляйте в следующий не накрытый край.

function findMinArrowShots(points) {
    points.sort((a, b) => a[1] - b[1]); // by right edge, never by left

    let arrows = 1;
    let shot = points[0][1]; // the earliest right edge

    for (const [start, end] of points) {
        if (start > shot) {
            arrows++;
            shot = end; // this balloon is out of reach of the last arrow
        }
    }

    return arrows;
}

Жадный алгоритм (обменный аргумент): когда применять?

Паттерн «Жадный алгоритм (обменный аргумент)» нужен, когда в условии есть слова «наименьшее число монет или частей на сумму», «берём самую крупную, что ещё помещается» или «выдать сдачу номиналами». Решение на нём обычно укладывается в O(n log n).

  • наименьшее число монет или частей на сумму
  • берём самую крупную, что ещё помещается
  • выдать сдачу номиналами
  • доказать оптимальность обменным аргументом

Слова в условии для всех паттернов собраны в одной таблице: шпаргалка по паттернам алгоритмов.

Жадный алгоритм (обменный аргумент): с чем путают?

Паттерн «Жадный алгоритм (обменный аргумент)» чаще всего путают с этими паттернами: Динамическое программирование (1-D), Бэктрекинг, Сортировка с пользовательским компаратором и Бинарный поиск по ответу.

Жадный алгоритм (обменный аргумент): частые ошибки

  • Пропускают доказательство

    Жадное правило, звучащее верно, очень часто неверно. Сначала поищите контрпример.

  • Сортируют не по тому ключу

    Ранний старт и ранний конец дают разные ответы. Ключ выбирает доказательство, а не интуиция.

  • Берут жадность там, где выборы связаны

    Размен монет со странными номиналами её ломает. Там безопасен только динамический подход.

  • Пытаются отменить выбор

    Как только жадность что-то забирает назад, это уже перебор. Пишите бэктрекинг или динамику.

Паттерн «Жадный алгоритм (обменный аргумент)» решает такие задачи с собеседований: Непересекающиеся интервалы, Наименьшее число стрел, Прыжки по массиву, Заправки по кругу, Планировщик задач, Разбиение строки на части и Раздача печенья.

  • Непересекающиеся интервалы: Оставляйте тот интервал, что кончается раньше.
  • Наименьшее число стрел: По одной стреле на группу пересечений.
  • Прыжки по массиву: Следите за самым дальним достижимым индексом.
  • Заправки по кругу: Начинайте заново там, где бак ушёл в минус.
  • Планировщик задач: В каждом раунде ставьте самую частую задачу.
  • Разбиение строки на части: Режьте, как только все встреченные буквы закончились.
  • Раздача печенья: Давайте ребёнку наименьшее подходящее печенье.

Жадный алгоритм (обменный аргумент): сложность по времени и памяти

У паттерна «Жадный алгоритм (обменный аргумент)» целевая сложность O(n log n).

O(n log n), если вход сначала нужно отсортировать. Проход после сортировки это один цикл, O(n).

Где этот паттерн стоит в 150 шагах