int AbsDiff(int a[], int n)
{
if ( n < 2 ) return 0;
sort(a,a+n);
int sum = 0;
int i;
for(i=n-1;i>=0;i--)
{
sum += (a[i]*(i) - a[i]*(n-i-1));
}
return sum;
}
0
看看 JAVA 中的这一小段工作代码 . 希望它有所帮助并且有意义 .
import java.util.Arrays;
public class PairDifference {
public static void main(String[] args) {
int[] arr = {2,3,5,7};
System.out.println(getPairDifference(arr));
}
static int getPairDifference(int[] a){
int diff = 0;
Arrays.sort(a);
int n = a.length;
for(int i=0; i<n; i++)
diff += (a[i]*i) - (a[n-1-i]*i);
return diff;
}
}
7 回答
我想我发布这篇文章的时间已经很晚了,但我想这个CPP计划应该可行 .
}
附:提供n> 2 . 如果这里有问题,请随时纠正我 .
如果数组的大小= 4,下面的代码计算[0]( - 3)a [1]( - 1)a [2](1)a [3](3) .
如果需要处理排序数组,可以先使用O(n * log(n))复杂度的快速排序算法对其进行排序 .
我想你可以
将每个数字的相乘与#count - 1相加,得到总数
将前面开头的每个数字与#count - 1相乘,得到要减去的总数
这将成为
(7*3 + 5*2 +3*1) - (2*3 + 3*2 + 5*1) = 17
只是另一种观点 . 这是Mathematica代码:
n
=比列表长度少一个Range[-n, n, 2]
创建一个包含-n
到n
的数字的列表,步长为2
,例如Range[-4, 4, 2]
={-4, -2, 0, 2, 4}
.
是矢量点积,例如{a, b, c} . {x, y, z}
=a x + b y + c z
Sort
只是排序 .所以,对于你的例子,我们有:
{-3, -1, 1, 3} . {2, 3, 5, 7}
=17
这是列表长度与时间的关系图:
请注意,您将每个数字恰好添加k次(如果您对列表进行排序,则k为其位置)
另外,你每个数字减去n-1-k次
您可以对列表进行排序(O(nlogn)),然后迭代排序的数组,将每个元素相乘,如上所述 .
我想我找到了答案 . 我通过查看帖子中的结果表达式得到了它 .
这是C中的代码 .
看看 JAVA 中的这一小段工作代码 . 希望它有所帮助并且有意义 .