假设我们有一个整数数组。保证所有相邻的元素都不同。让我们使用以下关系式定义该数组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},最小交换 = 1(交换2和3)
测试用例2:{1,2,3,4,5,6,7}:最小交换 = 2(将7和4交换以及将6和5进行交换)
测试用例3:{10,3,15,7,9,11}:最小交换 = 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)
的时间内完成。
{+,-,+,-,...}
或者也可以是{+,-,-,-,+,-,+,+}
。这两种情况都有“最小双峰性”,如本问题所定义。 - darkskya[i] == a[i - 1]
时会发生什么情况进行条件判断。 - darksky{1,7,8,9,10,13,11}:current bt = 4:Swap 1、7和8、9:minSwaps = 2
实际上有minSwaps = 1,因为交换例如1和8(或者说7和9)会立即得到bt = 0。请等待,我已经制定并几乎证明了一组定理,说明目标交换次数是初始bt的函数,而与a无关。将尽快发布答案。 - hidefromkgb