Q题目
华为06年面试题(要求8分钟完成)
有两个数组a,b,大小都为n,数组元素的值任意,无序;
要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小。
A解法
1.常见错误逻辑
错误逻辑一:将两个数组合并为一个数组,进行排序,将前面n个小的作为数组a,后面n作为数组b,a减b得到值,即为最小值。【该思路对题意理解有误,这里求最小差值,指的是绝对值】
错误逻辑二:同样是将两个数组合并,然后排序,此时采用交错的取法,分配给两个数组a和b,比如1,2,3,4,将1和3分给a,2和4非配给b【明显是错误的】。还有人采用更加严谨一些的方法,就是没次交错给两个数组非配值前,比较一下两个数组和的大小,给小的分配大值,此时1,2,3,4的分配结果是- - a数组为:1 , 4 - - b数组为:2 , 3 。貌似是正确的,但假如最大数非常大,大到比剩余所有数字的总和还大呢?此时应该是将前面(n-1)个最小值与最大值组合在一起。
2.最小差值算法
2.1逻辑分析
大概逻辑:将数组a的每一个数依次去与数组b中的每个数,进行交换,每次交换完成后分别计算两个数组的差值(minus),如果差值变大则,不交换,差值变小则交换。此时时间复杂度为O(n!)
详细分析:
1)数组a的第一个数与数组b第一个数进行交换,交换后两数组差值变小,则不做改变了,若变大了,则重新交换回来
2)在上一步基础上,再用数组a的第一个数(可能是a[0],也可能交换后的b[0])去与数组b的第二个数进行交换,差值变小,则不作改变,变大,则重新换回来,依次进行比较
3)数组a的第一个数与数组b中的所有数进行交换处理后,采用同样的方法,再用数组a的第二个数与数组b中的所有数依次进行交换,在比较差值来处理缺点:计算量大,有许多重复的计算
2.2实现代码如下
package 华为面试两数组最小差值;
import java.util.Arrays;
public class Test2 {
public static