这是最有效的方式吗?

时间:2015-05-15 08:30:52

标签: java arrays big-o

我正在寻找列表中2个双打之间的最大区别,我在NlogN时间这样做了,有没有办法在线性时间内完成?谢谢!

public static double NlogN(double[] ar){
    Arrays.sort(ar);
    double max=ar[ar.length-1];
    double min=ar[0];
    double difference=max-min;
    return difference;
}

2 个答案:

答案 0 :(得分:5)

如何不先排序数组,只是遍历它,收集最小值和最大值?

public static double linear(double[] ar) {
    double max = Double.NEGATIVE_INFINITY;
    double min = Double.POSITIVE_INFINITY;

    for(double elem: ar){
        if(min > elem) {min = elem;}
        if(max < elem) {max = elem;}
    }

    return Math.abs(max-min); 
}

答案 1 :(得分:1)

您不需要对整个阵列进行排序。您只能迭代一次,找到最小和最大的数字。我认为一个简单的方法会更快。由于您迭代数组一次,复杂性将为N.

            double smallest = ar[0];
            double largetst = ar[0];

            for(int i=1; i< ar.length; i++)
            {
                    if(ar[i] > largetst)
                            largetst = ar[i];
                    else if (ar[i] < smallest)
                            smallest = ar[i];

            }

           result = largest-smallest;