zoukankan      html  css  js  c++  java
  • 求两个数组的最小差值

    一.分析逻辑

    大概逻辑:将数组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     }
  • 相关阅读:
    [原] 秋叶原随景
    ReportViewer不连接数据库,自定义DataSet导出到报表
    【程序人生】一个程序员对学弟学妹建议(转)
    c#钩子学习笔记(一)
    解决关于多客户端操作数据库并发问题
    SQL Server 存储过程
    有关抽奖的一个算法
    c#发送邮件含附件
    CrystalReport不连接数据库,自定义DataSet导出到水晶报表
    c#钩子学习笔记(二)
  • 原文地址:https://www.cnblogs.com/KdeS/p/12069801.html
Copyright © 2011-2022 走看看