一.分析逻辑
大概逻辑:将数组a的每一个数依次去与数组b中的每个数,进行交换,每次交换完成后分别计算两个数组的差值(minus),如果差值变大则,不交换,差值变小则交换。此时时间复杂度为O(n!)
详细分析:
1)数组a的第一个数与数组b第一个数进行交换,交换后两数组差值变小,则不做改变了,若变大了,则重新交换回来
2)在上一步基础上,再用数组a的第一个数(可能是a[0],也可能交换后的b[0])去与数组b的第二个数进行交换,差值变小,则不作改变,变大,则重新换回来,依次进行比较
3)数组a的第一个数与数组b中的所有数进行交换处理后,采用同样的方法,再用数组a的第二个数与数组b中的所有数依次进行交换,在比较差值来处理
二. 实现代码如下
1 //两数组进行元素交换实现最小差值 2 public static void getMinusArray(int[] a, int[] b) { 3 // 数组a和b的和 4 int suma = getSum(a); 5 int sumb = getSum(b); 6 7 int startMinus = Math.abs(suma - sumb); 8 // System.out.println("startMinus="+startMinus); 9 int minus = 0; 10 for(int i = 0; i < a.length; i++){ 11 for(int j = 0; j < a.length; j++) { 12 //先交换 13 int temp=a[i]; 14 a[i]=b[j]; 15 b[j]=temp; 16 //交换后的差值 17 minus = Math.abs(getSum(a) - getSum(b)); 18 if(minus<startMinus){ 19 startMinus = minus; 20 }else{ 21 //若交换后,差值比原来大或相等,则不交换--即重新换回来 22 int temp2=a[i]; 23 a[i]=b[j]; 24 b[j]=temp2; 25 } 26 } 27 } 28 }
1 //效果是一样的 2 public static Integer choicePreset(Map<Integer,Object> map,double ble ) { 3 ble=Math.abs(ble); 4 //存差值的绝对值 5 List<Double> sub=new ArrayList<Double>(); 6 //存差值对应的预置点 7 Map<Double, Integer> mapin=new HashMap<>(); 8 for (Integer key:map.keySet()) { 9 double values=Math.abs(Double.valueOf(map.get(key).toString())-ble); 10 sub.add(values); 11 mapin.put(values, key); 12 } 13 //对差值的绝对值排序 14 Collections.sort(sub); 15 return mapin.get(sub.get(0));//取最近的预置点 16 }
1 / 求数组和 2 public static int getSum(int[] arr) { 3 int sum = 0; 4 for (int i : arr) { 5 sum += i; 6 } 7 return sum; 8 }