С 1 & le; x i & le; n : O (n)
Так как для каждого x i он содержит 1 & le; x i & le; n , он удерживает его в силу принцип голубя , либо все значения существуют точно один раз , либо значение существует два или более раз .
В первом случае разница составляет 1
(для массива, превышающего 1 элемент), во втором случае результат равен 0
, поскольку тогда есть два элемента, которые в точности равны.
Таким образом, мы можем перебирать массив и отслеживать числа. Если число уже существует один раз, мы возвращаем 0
, в противном случае мы возвращаем 1
, например:
// only if it holds that for all i, 1 <= arr[i] <= arr.length
static int findResult(int[] arr) {
bool[] found = new bool[arr.length]
for(int i = 0; i < arr.length; i++) {
if(found[arr[i]-1]) {
return 0;
} else {
found[arr[i]-1] = true;
}
}
return 1;
}
Для случайного массива, который удовлетворяет условию с n элементами, в n! / N n случаев он вернет 1
, а в других случаях он вернет 0
, поэтому среднее значение по случайному вводу равно n! / n n . Когда n увеличивается, становится маловероятным, что "столкновений" нет, и поэтому, как говорит @ YvesDaoust , приближение 0
весьма вероятно.
Без 1 & le; x i & le; n : O (n log n)
В случае, если мы снимаем ограничение, мы можем сначала отсортировать массив, и в этом случае мы перебираем последовательные элементы:
static int findResult(int[] arr) {
Arrays.sort(arr);
int dmin = arr[1] - arr[0];
for(int i = 2; i < arr.length; i++) {
int d = arr[i] - arr[i-1];
if(d < dmin) {
if(d == 0) {
return 0;
}
dmin = d;
}
}
return dmin;
}