查找数组中每对整数的绝对差值之和

时间:2011-05-02 08:34:23

标签: algorithm

给定一个数组,找到每对整数的绝对差值之和。

例如:给定a[]= {2,3, 5, 7 };

输出为(3-2) + (5-2) + (7-2) + (5-3) + (7-3) + (7-5) = 17

必须比O(n^2)更好。

原始数组不一定要排序。

8 个答案:

答案 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.

我想你可以

  • 将从#count - 1开始向后的每个数字相乘得到总数
  • 将前面开头的每个数字的乘法与#count - 1相加,得到要减去的总数

这将成为(7*3 + 5*2 +3*1) - (2*3 + 3*2 + 5*1) = 17

答案 3 :(得分:3)

首先需要以O(nlogn)时间对数组进行排序。

现在,我不会为您提供此问题的确切解决方案,而是为您提供解决该问题的直觉。 如果我们尝试归纳索引 i 上特定数字被添加的次数和被减去的次数,那么对于每个索引 i 我们都可以使用该数学公式可以计算出每个数字在 O(N)时间和O(1)额外空间中的绝对差值中所占的总和。

如果您在理解此概念时遇到困难,可以参考此视频。

视频链接:-https://youtu.be/A4sz4kNDa-8

答案 4 :(得分:1)

只是另一种观点。这是Mathematica代码:

With[{n = Length@# - 1}, Range[-n, n, 2].Sort[#]] & 

n =比列表长度少一个

Range[-n, n, 2]-n的步长创建一个包含n2的数字的列表,例如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

以下是列表长度与时间的关系图:

enter image description here

答案 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;
    }

}