一.分析邏輯
大概邏輯:將數組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 }