给定一个数组,求出每对整数的绝对差之和。
例如:给定a[]= {2,3, 5, 7 };
输出将是(3-2) + (5-2) + (7-2) + (5-3) + (7-3) + (7-5) = 17
。
它必须比O(n^2)
做得更好。
原始数组不一定是排序的。
发布于 2011-05-02 16:40:03
注意,每个数字恰好相加k次(如果对列表进行排序,其中k是它的位置)
同样,你将每个数字精确地减去n-1-k次
您可以对列表进行排序(O(nlogn)),然后迭代排序后的数组,如上所述将每个元素相乘。
发布于 2011-05-02 16:43:33
我想我已经找到答案了。我通过查看我的帖子中的结果表达式得到了它。
以下是C++中的代码。
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;
}
发布于 2011-05-02 16:43:16
以
为例:给定a[]= {2,3,5,7 };
输出将是(3-2) + (5-2) + (7-2) + (5-3) + (7-3) + (7-5) = 17。
我想你可以
计数求和从#
-1的乘积得到要减去的总数
这样就变成了(7*3 + 5*2 +3*1) - (2*3 + 3*2 + 5*1) = 17
https://stackoverflow.com/questions/5855066
复制相似问题