求兩個數組的最小差值


一.分析邏輯

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM