数组:找到最小数量的交换以使数组的比特最小化?

时间:2017-07-14 23:40:05

标签: arrays algorithm

假设我们得到一个整数数组。所有相邻元素都保证不同。让我们使用以下关系将此数组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)中完成。

1 个答案:

答案 0 :(得分:2)

紧急更新:T3不成立!

考虑α= [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),并更正式地定义:

显而易见的事实:

  1. 互换是对称的:

    S ij (a)= S ji (a)

  2. 如果目标位置不相交,则两次掉期是独立的:

    S ij (S kl (a))= S kl (S ij ( a))∀i,j,k,l:{i,j}∩{k,l} =∅

  3. 两个2依赖互换互为撤消:

    S ij (S ij (a))= a

  4. 两个1依赖互换遵循以下内容:

    S jk (S ij (a))= S ij (S ik ( a))= S ik (S jk (a))

  5. 对于大小相同的数组,偶然性差异总是如此:

    (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>

    定理

    [T1] | B(S ij (a)) - B(a)| ≤4∀a,S ij (a)

    不失一般性,我们假设:

    • 0&lt; i,j&lt; | A | - 1
    • j - i≥2
    • a i-1 &lt;一个<子> i + 1的
    • a j-1 &lt;一个<子> J + 1

    取决于 a i ,可能有3种情况:

    1. a i-1 &lt; a i &lt; a i + 1 :sgn(a i - a i-1 )+ sgn(a i + 1 - i )= 1 + 1 = 2
    2. a i &lt; a i-1 &lt; a i + 1 :sgn(a i - a i-1 )+ sgn(a i + 1 - i )= -1 + 1 = 0
    3. a i-1 &lt; a i + 1 &lt; a i :sgn(a i - a i-1 )+ sgn(a i + 1 - a i )= 1 + -1 = 0
    4. 当改变 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

      [T2] ∀a:| B(a)| ≥2∃S ij (a):| B(S ij (a))| = | B(a)| - 2

      {证据正在进行中,需要睡觉}

      [T3] ∀a:| B(a)| ≥4∃S ij (a):| B(S ij (a))| = | B(a)| - 4

      {证据正在进行中,需要睡觉}

      结论

      T1 T2 T3 ,最小化交换次数 | B(a)| 等于:

      <强>⌊| B(一)| /4⌋+ß

      如果 | B(a)|,ß等于1 mod4≥2,否则为0。