решение O (n): алгоритм пытается поместить каждый элемент в массиве в правильную позицию, например, 1 на a [0] и 2 на a [1], путем замены на элемент занимает исходную позицию.
сначала, я = 1, a [i - 1] = 1, все в порядке, и ничего не будет затронуто
i = 1
a = 1 6 3 4 5 7 1
тогда, i = 2, a [i - 1] = 6! = 2, затем поменяйте местами a [i - 1] и a [6 - 1]
i = 2
a = 1 7 3 4 5 6 1
тогда я по-прежнему равен 2, но a [i - 1] == 7! = 2, затем поменяйте местами a [i - 1] и a [7 - 1]
i = 2
a = 1 1 3 4 5 6 7
теперь i = 2, но мы видим, что a [i - 1] == a [1 - 1], поэтому мы находим дубликат
полный источник:
#include <stdio.h>
int main() {
int a[7] = {1, 6, 3, 4, 5, 7, 1};
int i, t;
for (i = 0; i < 7; ++i) {
while (a[i] != i + 1) {
if (a[i] == a[a[i] - 1]) {
printf("duplicate: %d\n", a[i]);
goto out;
}
t = a[i];
a[i] = a[a[i] - 1];
a[t - 1] = t;
}
}
printf("no duplicate\n");
out:
return 0;
}