Предположим, нам задан массив целых чисел. Все соседние элементы гарантированно отличаются друг от друга. Определим битности этого массива a
как bt
, используя следующее соотношение:
bt_array[i] = 0, if i == 0;
= bt_array[i-1] + 1, if a[i] > a[i-1]
= bt_array[i-1] - 1, if a[i] < a[i-1]
= bt_array[i-1], if a[i] == a[i-1]
bt = last item in bt_array
Мы говорим, что битничность массива минимальна, когда его битность равна 0, если она имеет нечетное число элементов или ее битности составляет +1 или -1, если она имеет четное число элементов.
Проблема заключается в разработке алгоритма, который находит наименьшее количество свопов, необходимых для того, чтобы сделать битничность любого массива минимальным. Временная сложность этого алгоритма должна быть в худшем случае O (n), n - количество элементов в массиве.
Например, предположим, что a = {34,8,10,3,2,80,30,33,1}
Его начальный bt
равен -2. Минимальное значение равно 0. Это может быть достигнуто только с одним обменом, а именно с заменой 2 и 3. Таким образом, выход должен быть равен 1.
Вот несколько тестовых примеров:
Тестовый случай 1: a = {34,8,10,3,2,80,30,33,1}, min swaps = 1 (swap 2 и 3)
Тестовый случай 2: {1,2,3,4,5,6,7}: min swaps = 2 (своп 7 с 4 и 6 с 5)
Тестовый случай 3: {10,3,15,7,9,11}: мин. swaps = 0. bt = 1 уже.
И еще несколько:
{2,5,7,9,5,7,1}: ток
bt
= 2. Обмен 5 и 7: minSwaps = 1{1,7,8,9,10,13,11}: ток
bt
= 4: обмен 1,8: minSwaps = 1{13,12,11,10,9,8,7,6,5,4,3,2,1}: ток
bt
= -12: своп (1,6), (2,5 ) и (3,4): minSwaps = 3
Мне задали этот вопрос в интервью, и вот что я придумал:
1. Sort the given array.
2. Reverse the array from n/2 to n-1.
3. Compare from the original array how many elements changed their position.
Return half of it.
И мой бит кода, который делает это:
int returnMinSwaps(int[] a){
int[] a = {1,2,3,4,5,6,7};
int[] b = a;
Arrays.sort(b);
for(int i=0; i<= b.length/2 - 1; i++){
swap(b[b.length - i], b[b.length/2 - i]);
}
int minSwaps = 0;
for(int i=0;i<b.length;i++){
if(a[i] != b[i])
minSwaps++;
}
return minSwaps/2;
}
К сожалению, я не получаю правильное минимальное количество способов для некоторых тестовых случаев, используя эту логику. Кроме того, я сортирую массив, который делает его в O(n log n)
, и это нужно сделать в O(n)
.