微软面试100题系列---交换元素使2个序列的差值最小

来源:互联网 发布:微商城数据库设计 编辑:程序博客网 时间:2024/06/06 08:38

题目

有两个序列a,b,大小都为n,序列元素的值任意整数,无序;
要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。

实现

思路:
当前数组a和数组b的和之差为
A = sum(a) - sum(b)
a的第i个元素和b的第j个元素交换后,a和b的和之差为
A’ = sum(a) - a[i] + b[j] - (sum(b) - b[j] + a[i])
= sum(a) - sum(b) - 2 (a[i] - b[j])
= A - 2 (a[i] - b[j])
设x = a[i] - b[j]
|A| - |A’| = |A| - |A-2x|
|A’|= |A-2x|
假设A > 0,
当x 在 (0,A)之间时,做这样的交换才能使得交换后的a和b的和之差变小,x越接近A/2效果越好,
如果找不到在(0,A)之间的x,则当前的a和b就是答案。
所以算法大概如下:
在a和b中寻找使得x在(0,A)之间并且最接近A/2的i和j,交换相应的i和j元素,重新计算A后,重复前面的步骤直至找不到(0,A)之间的x为止。

代码实现:

    public static void BalanceArray(int[] array1,int[] array2){        if(array1.length!=array2.length){            return;        }        int sumA=sum(array1);        int sumB=sum(array2);        if(sumA==sumB){            return;        }        //        if(sumA<sumB){            int[] array=array1;            array1=array2;            array2=array;        }        int n=array1.length;        boolean ifCycle=true;        int curDiff=1;        int oldDiff=Integer.MAX_VLAUE;        int pa=-1;        int pb=-1;        while(ifCycle){            ifCycle=false;                      curDiff=sum(array1)-sum(array2);//交换之前的差值            //寻找位于(0,A)之间的x=a[i]-a[j]            /*寻找所有使交换后的差值变小的x中,使差值最小的x;交换,然后重新查找。为了重新查找,需要设置一个标志,代表是否还需要重新查找;如果找到x,则需要重新查找;*/            for(int i=0;i<n;i++){                for(int j=0;j<n;j++){                    int itemValue=array1[i]-array2[j];                    int newDiff=Math.abs(currDiff-2*itemValue);//交换之后的差值                    if(newDiff<curDiff && newDiff<oldDiff){                        ifCycle=true;                        pa=i;                        pb=j;                    }                }            }            if(ifCycle){               //交换元素               int tmp=array1[i];               array1[i]=array2[j];               array2[j]=tmp;            }        }    }    private static int sum(int[] array) {        int sum=0;        for(int i=0;i<array.length;i++){            sum+=array[i];        }        return sum;    }
0 0
原创粉丝点击