Это проблема O (n ^ 2). Никакое другое решение не является более быстрым, чем прямое сравнение двух массивов.
Решение Virgil - это круто, за исключением того факта, что это не совсем O (n) производительность. Это действительно O (n + 1000) производительность. Сравнение массивов во второй раз для установки логической переменной является дорогостоящим и имеет неприятные последствия в небольших массивах.
Решение, которое вы написали, является лучшим, за исключением ошибок.
Вот исправленная ошибка версии.
boolean[] matchedPositions = new boolean[n];
for(int k = 0; k < n; k++
{
matchedPositions[k] = false;
}
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
if(matchedPositions[j] == false && a[i] == a[j])
{
matchedPositions[j] = true;
break;
}
if(j == n - 1)
{
return false;
}
}
}
return true;
В этом случае, если в случае совпадения целого числа, внутренний цикл будет разорван и установлен или помечено совпадающее положение. Это требуется для массивов с повторяющихся записей , это позволит избежать совпадения двух записей в левом массиве с одной записью в правом массиве.
Если в случае, если совпадение не произошло, что идентифицируется как j == n - 1 , вы вернете false.
Поскольку мы ожидаем, что значение по умолчанию false в логическом значении, лучше пометить initialize it.
На самом деле это решение имеет O (n log n + n) снижение производительности. Сортировка и сравнение также приводят к снижению производительности O (n ^ 2 + n). Сортировка имеет производительность O (n ^ 2) и один цикл для проверки. Но сортировка изменяет содержимое массива, а это не так.