Здравствуйте, free.rFczZZ, Вы писали:
FR>есть массив из N целых чисел от 0 до N. Каждое число из массива повторяется в нем 1 раз, кроме 0 (нуля) — он может встретиться сколько угодно раз. Задача — найти недостающие числа массива (в диапазоне от 1 до N) вместо которых стоит 0. Использовать в качестве вспомогательных только простые целочисленные переменные. Скорость роста алгоритма O(N) = N
Если массив можно разрушать, то всё очень просто.
Выполняем дефрагментацию, а потом пробегаем и смотрим, где нули.
int arr[N];
for(int i=1; i<=N; ++i)
{
int& here = arr[i-1];
while(here != 0 && here != i)
swap(here, arr[here-1]);
// после этой операции текущий элемент оказывается на своём месте
// поэтому число элементов, стоящих не на своём месте, убывает;
}
for(int i=1; i<=N; ++i)
{
int const& here = arr[i-1];
if(here == 0)
cout << "отсутствует число " << i << endl;
}