假设我们得到一个整数数组。所有相邻元素都保证不同。让我们使用以下关系将此数组a
的 bitonicity 定义为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.这可以通过1次交换来实现,即交换2和3.因此输出应为1.
以下是一些测试用例:
测试用例1:a = {34,8,10,3,2,80,30,33,1},min swaps = 1(交换2和3)
测试案例2:{1,2,3,4,5,6,7}:min swaps = 2(交换7与4和6与5)
测试案例3:{10,3,15,7,9,11}:min 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)
中完成。
答案 0 :(得分:2)
考虑α= [0,7,8,3,4,10,1,6,9,2,5] 。没有 S ij (α)可以将 | B(α)| 降低2以上。
考虑修改方法......
此解决方案仅在没有相等的数组元素时才有效。
通过编辑答案,随意提出概括。
如果你想跳过无聊的部分,请直接进入结论。
让我们在数组 a 上定义交换运算符 S ij :
S ij (a):[... a i ,... a j ,...]→[... a j ,... a i ,...]∀i,j∈[0; | a |)∩ℤ:i≠j
我们还将比特性称为 B(a),并更正式地定义:
显而易见的事实:
互换是对称的:
S ij (a)= S ji (a)
如果目标位置不相交,则两次掉期是独立的:
S ij (S kl (a))= S kl (S ij ( a))∀i,j,k,l:{i,j}∩{k,l} =∅
两个2依赖互换互为撤消:
S ij (S ij (a))= a
两个1依赖互换遵循以下内容:
S jk (S ij (a))= S ij (S ik ( a))= S ik (S jk (a))
对于大小相同的数组,偶然性差异总是如此:
(B(a) - B(a'))mod 2 =0∀a,a':| a | = | a'|
当然,∀i:0&lt;我&lt; | A | 强>,
B([a i-1 ,a i ]) - B([a' i-1 ,a ' i ])= sgn(a i - a i-1 ) - sgn(a' i - 一个'<子> I-1 子>)强>,
可以是1 - 1 = 0,或1 - -1 = 2,或-1 - 1 = -2,或-1 - -1 = 0,任意数量的±2`s和0总结得到了均匀的结果。
NB:只有当 a 中的所有元素彼此不同时才会出现这种情况,与 a'相同!
< / LI> 醇>不失一般性,我们假设:
取决于 a i ,可能有3种情况:
当改变 a i 并且 a 的所有其他元素保持不变时, | B(a') - B(a )| ≤2(其中 a'是结果数组,上述3种情况也适用),因为 B(a)的其他条款没有改变值,除了 a i 的1邻域中的那两个。
S ij (a)表示上述内容发生两次,一次是 a i 一次用于 a j 。
因此, | B(S ij (a)) - B(a)| ≤2+ 2 = 4 。
类似地,对于每个角和 j - i = 1 最大值。可能的delta是2,即≤4。
最后,这直接推断为 a i-1 &gt; a i + 1 和 a j-1 &gt;一个<子> J + 1 子> 强>
QED
{证据正在进行中,需要睡觉}
{证据正在进行中,需要睡觉}
从 T1 , T2 和 T3 ,最小化交换次数 | B(a)| 等于:
<强>⌊| B(一)| /4⌋+ß,
如果 | B(a)|,ß等于1 mod4≥2,否则为0。