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

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

Полевой справочник

Преобразование массива на месте

O(n)

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

Сигналы

изменить массив на местеO(1) дополнительной памятине выделять ещё один массив/строкуразвернуть/повернуть/разбить/переместить элементы в одном буферевернуть новую длину после удаления дубликатов

Шаблон

function inPlaceTransform(arr) {
    let write = 0;
    for (let read = 0; read < arr.length; read++) {
        if (shouldKeep(arr[read])) {
            arr[write] = arr[read];
            write++;
        }
    }
    return write; // new logical length
}

Похоже, но не то

  • Два указателя (в одну сторону): Здесь работа на месте это ЦЕЛЬ (O(1) памяти, один буфер); пара медленный/быстрый указатель это лишь один из МЕХАНИЗМОВ, которым эта цель достигается. Разворот блока фиксированного размера или поворот массива тоже на месте, но без пары указателей.

n до 1e5..1e6 -> O(n): один проход по буферу, второй массив не создаётся, поэтому память остаётся O(1).

Изучить этот паттерн