求两个数组的最小差值

一.分析逻辑

大概逻辑:将数组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     }
posted @ 2019-12-19 19:51  憨憨青年  阅读(2322)  评论(0编辑  收藏  举报
// 侧边栏目录 // https://blog-static.cnblogs.com/files/douzujun/marvin.nav.my1502.css