给定一个数组,找到每对整数的绝对差值之和。
例如:给定a[]= {2,3, 5, 7 };
输出为(3-2) + (5-2) + (7-2) + (5-3) + (7-3) + (7-5) = 17
。
必须比O(n^2)
更好。
原始数组不一定要排序。
答案 0 :(得分:27)
请注意,您将每个数字恰好添加k次(如果您对列表进行排序,则k为其位置) 你也可以减去每个数字n-1-k次 你可以对列表进行排序(O(nlogn)),然后遍历排序的数组,将每个元素相乘,如上所述。
答案 1 :(得分:9)
我想我找到了答案。我通过查看帖子中的结果表达式得到了它。
这是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;
}
答案 2 :(得分:8)
例如:给定a [] = {2,3,5,7};
输出将是(3-2)+(5-2)+(7-2)+(5-3)+(7-3)+(7-5)= 17.
我想你可以
这将成为(7*3 + 5*2 +3*1) - (2*3 + 3*2 + 5*1) = 17
答案 3 :(得分:3)
首先需要以O(nlogn)时间对数组进行排序。
现在,我不会为您提供此问题的确切解决方案,而是为您提供解决该问题的直觉。 如果我们尝试归纳索引 i 上特定数字被添加的次数和被减去的次数,那么对于每个索引 i 我们都可以使用该数学公式可以计算出每个数字在 O(N)时间和O(1)额外空间中的绝对差值中所占的总和。
如果您在理解此概念时遇到困难,可以参考此视频。
答案 4 :(得分:1)
只是另一种观点。这是Mathematica代码:
With[{n = Length@# - 1}, Range[-n, n, 2].Sort[#]] &
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
以下是列表长度与时间的关系图:
答案 5 :(得分:0)
下面的代码计算[0] ( - 3)+ a [1] ( - 1)+ a [2] (1)+ a [3] (3),如果数组的大小= 4。
result := 0
for i := 0 to sizeof(a)-1 do
begin
result := result + a[i] * (i*2 - sizeof(a) + 1)
end
如果需要处理有序数组,可以先使用O(n * log(n))复杂度的快速排序算法对其进行排序。
答案 6 :(得分:0)
我觉得我发布这篇文章的时间已经很晚了,但我想这个CPP计划应该可行。
//JUST LIKE ANIMALS !!!!
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
ll funcy(ll a[], ll n)
{
ll sum = 0;
ll i;
for(i=0;i<n;i++)
{
sum += (a[i]*(i) - a[i]*(n-i-1));
}
return sum;
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);
ll i,n;cin>>n;ll v[n+1];
for(i=0;i<n;i++)cin>>v[i];
sort(&v[0],&v[n]);
cout<<AbsDiff(v,n);
return 0;
}
P.S。提供n> 2。如果这里有问题,请随时纠正我。
答案 7 :(得分: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;
}
}