Операции in-place
Изменяем данные без дополнительного массива
Операция называется in-place, если основной результат формируется прямо в исходной структуре данных, а объём дополнительной памяти не растёт вместе с размером входа. Для массива это обычно означает, что мы переставляем или перезаписываем его элементы вместо создания второго массива такой же длины.
Классический пример — разворот массива. Можно менять местами симметричные элементы, двигаясь от краёв к центру.
int left = 0;
int right = numbers.length - 1;
while (left < right) {
int temp = numbers[left];
numbers[left] = numbers[right];
numbers[right] = temp;
left++;
right--;
}
Алгоритм работает за O(n) времени и использует O(1) дополнительной памяти: независимо от размера массива нужны только несколько переменных.
Перезапись может быть безопасной
Чтобы менять массив на месте, важно понимать, какие значения уже больше не понадобятся. Например, если нужно заменить каждое отрицательное число нулём, старое значение можно сразу перезаписать после проверки.
for (int i = 0; i < numbers.length; i++) {
if (numbers[i] < 0) {
numbers[i] = 0;
}
}
Но не любую задачу стоит насильно превращать в in-place решение. Иногда отдельный массив делает код проще или нужен по смыслу задачи — например, если исходные данные должны остаться неизменными.
left, right
и temp допустимы. Важно, что дополнительная память остаётся O(1),
а не увеличивается вместе с n.