首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >求数组中每对整数的绝对差和

求数组中每对整数的绝对差和
EN

Stack Overflow用户
提问于 2011-05-02 16:34:23
回答 8查看 13.2K关注 0票数 14

给定一个数组,求出每对整数的绝对差之和。

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

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

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

原始数组不一定是排序的。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-05-02 16:40:03

注意,每个数字恰好相加k次(如果对列表进行排序,其中k是它的位置)

同样,你将每个数字精确地减去n-1-k次

您可以对列表进行排序(O(nlogn)),然后迭代排序后的数组,如上所述将每个元素相乘。

票数 32
EN

Stack Overflow用户

发布于 2011-05-02 16:43:33

我想我已经找到答案了。我通过查看我的帖子中的结果表达式得到了它。

以下是C++中的代码。

代码语言:javascript
运行
复制
    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;
    }
票数 9
EN

Stack Overflow用户

发布于 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开始的每个数字的乘法得到总计数求和从前面开始的每个数字与#

-1的乘积得到要减去的总数

这样就变成了(7*3 + 5*2 +3*1) - (2*3 + 3*2 + 5*1) = 17

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5855066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档