在Java中搜索最小绝对值差异

时间:2018-07-28 06:36:20

标签: java search

如何优化算法以找到给定数组中的最小绝对值差。这是我检查每个元素并返回值的方法。

static int minAbsVal(int[] myArray){

    ArrayList<Integer> diffs= new ArrayList(); // all absolute value differences

    for (int i = 0; i < myArray.length; i++) {
        for (int j = 0; j < myArray.length; j++) {
            if (myArray[j]!=myArray[i]){
                int absVal =Math.abs( myArray[i]- myArray[j]);
                diffs.add(absVal);
            }

        }
    }


    int min = diffs.get(0);
    for (int i = 1; i < diffs.size(); i++) {
        if (min>diffs.get(i)){
            min = diffs.get(i);
        }
    }
    return min;
}

4 个答案:

答案 0 :(得分:3)

检查此解决方案。如果数组包含重复项,则如果要避免,则返回0,也可以添加条件。

static int minAbsVal(int[] myArray){

            Arrays.sort(myArray);
            ArrayList<Integer> diffs= new ArrayList<Integer>(); // all absolute value differences

            for (int i = 0; i < myArray.length-1; i++) {
                diffs.add(Math.abs( myArray[i+1] - myArray[i]));
            }

            Collections.sort(diffs);
            return diffs.get(0);
        }

或者您也可以使用:-

static int minAbsVal(int[] myArray){

        Arrays.sort(myArray);
        int minimum=Math.abs( myArray[1] - myArray[0]);
        for (int i = 1; i < myArray.length-1; i++) {
            int diff = Math.abs( myArray[i+1] - myArray[i]);
            if (diff == 0)
                return 0;
            else if (minimum > diff)
                minimum = diff;
        }
        return minimum;
    }

答案 1 :(得分:1)

检查以下解决方案,

static int minimumAbsoluteDifference(int n, int[] arr) {
    int a = Math.abs(arr[1]-arr[0]);
    Arrays.sort(arr);
    for(int x=0;x<n-1;x++){
        if(Math.abs(arr[x]-arr[x+1])<a){
            a = Math.abs(arr[x]-arr[x+1]);
            if(a==0){
               return a;
            }
        }
    }
    return a;
}

答案 2 :(得分:0)

根据数组的大小,一种好的方法是将其分成不同的较小数组,并在pararell中寻找每个数组的最小值,然后比较这些结果。

无论如何,您不需要太多的迭代,您只需将baseValue设置为数组的第一个元素,然后在对数组进行迭代时将baseValue与current进行比较,如果current较小,则将baseValue赋给current(我将重命名在这种情况下,将baseValue转换为minValue)

答案 3 :(得分:0)

避免对同一对数字进行两次比较。一旦计算出前两个元素的差(i为0,j为1),您将稍后在i为1且j为0时进行相同的比较。

要使效率翻倍,请使j大于i

static int minAbsVal(int[] myArray) {
    int min = Integer.MAX_VALUE;
    for (int i = 0; i < myArray.length; i++) {
        for (int j = i + 1; j < myArray.length; j++) {
            // update min if we found a new minimal distance
            min = Math.min(min, Math.abs(myArray[i] - myArray[j]));
        }
    }
    return min;
}