我正在寻找列表中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;
}
答案 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;