В основном вы хотите проверить, является ли ваш массив перестановкой [0...n-1]
.Есть простые алгоритмы для этого, которые O(n)
как по времени, так и по памяти.См., Например, этот файл PDF .
Иногда я использую очень простую проверку, которая O(n)
во времени и O(1)
в памяти.Теоретически он может возвращать ложные срабатывания, но это хороший способ найти большинство ошибок.Он основан на следующих фактах:
0 + 1 + 2 + ... + n-1 == n * (n-1) / 2
0 + 1² + 2² + ... + (n-1)² == n * (n-1) * (2 * n - 1) / 6
Я не знаю цель-c, но код будет выглядеть так на C #:
bool IsPermutation(int[] array)
{
long length = array.Length;
long total1 = 0;
long total2 = 0;
for (int i = 0; i<length; i++)
{
total1 += array[i];
total2 += (long)array[i] * array[i];
}
return
2 * total1 == length * (length - 1) &&
6 * total2 == length * (length - 1) * (2 * length - 1);
}