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

Sha*_*fiz 12 algorithm

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

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

输出将是(3-2) + (5-2) + (7-2) + (5-3) + (7-3) + (7-5) = 17.

它必须做得更好O(n^2).

原始数组不一定排序.

ami*_*mit 27

请注意,您将每个数字精确地添加k次(其中k是它的位置,如果您对列表进行排序)
也是,您将每个数字精确地减去n-1-k次,
您可以对列表进行排序(O(nlogn))然后迭代排序数组,如上所述乘以每个元素.


Sha*_*fiz 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,在迭代数组之前需要进行排序,否则您甚至可能得到否定答案. (2认同)

Lie*_*ers 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

  • @Gunner - 在尝试解释问题时找到答案的典型案例:).+1但我觉得接受的答案应该是amit.他击败了我们两个人. (2认同)