Вам дан массив из n + 2 элементов.Все элементы массива находятся в диапазоне от 1 до n.И все элементы встречаются один раз, за исключением двух чисел, которые встречаются дважды
Позволяет немного изменить это и использовать только n
, а не n+2
, и в первой части постановки задачи она становится
Вам дан массив из n элементов.Все элементы массива находятся в диапазоне от 1 до n
Итак, теперь вы знаете, что у вас есть массив, числа в массиве начинаются с 1 и увеличиваются на единицу для каждого элемента в массиве.Таким образом, если у вас есть 10 элементов, массив будет содержать числа от 1 до 10. 5 элементов, у вас есть от 1 до 5 и т. Д.
Из этого следует, что числа, хранящиеся в массиве, могут использоваться для индексациимассив.то есть вы всегда можете сказать A[A[i]]
, где i <= размер A. например, <code>A={5,3,4,1,2}; print A[A[2]]
Теперь давайте добавим один повторяющийся номер.Алгоритм берет значение каждого числа в массиве и посещает этот индекс.Мы знаем, что если мы дважды посещаем один и тот же индекс, мы знаем, что нашли дубликат.
Как мы узнаем, что дважды посещаем один и тот же индекс?
Да, мы меняем знак числа в каждом посещаемом нами индексе., если знак уже изменился, мы знаем, что мы уже были здесь, следовательно, этот индекс (не значение, сохраненное в индексе) является дублирующим числом.
Вы можете достичь того же результата, сохраниввторой массив логических значений, инициализированный как false.Этот алгоритм становится
A={123412}
B={false, false, false, false}
for(i = 1; i <= 4; i++)
{
if(B[A[i]])
// Duplicate
else
B[A[i]] = true;
}
Однако в вопросе MS вы меняете знак элемента в A вместо установки логического значения в B.
Надеюсь, это поможет,