这是最有效的方法吗?
is this the most efficient way?
我正在寻找列表中两个双打之间的最大差异,我已经在 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;
}
您不需要对整个数组进行排序。您只能迭代一次并找到最小和最大的数字。我认为一个简单的 for 会更快。由于您对数组进行了一次迭代,因此复杂度将为 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;
不先对数组进行排序,而是遍历它,收集最小值和最大值怎么样?
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);
}
我正在寻找列表中两个双打之间的最大差异,我已经在 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;
}
您不需要对整个数组进行排序。您只能迭代一次并找到最小和最大的数字。我认为一个简单的 for 会更快。由于您对数组进行了一次迭代,因此复杂度将为 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;
不先对数组进行排序,而是遍历它,收集最小值和最大值怎么样?
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);
}