如何优化算法以找到给定数组中的最小绝对值差。这是我检查每个元素并返回值的方法。
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;
}
答案 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;
}