首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简化计算每个元素与其右侧元素之间的差值

简化计算每个元素与其右侧元素之间的差值
EN

Stack Overflow用户
提问于 2016-02-22 23:48:50
回答 2查看 42关注 0票数 0

我能让它变得更简单吗?

代码语言:javascript
复制
 for(int k=0;k<n;k++)
 for(int l=(k+1);l<n;l++)
 {
     tot+=(max(a[k],a[l])-min(a[k],a[l]));
 }

此程序当前执行时间较长,超过了时间限制。

EN

回答 2

Stack Overflow用户

发布于 2016-02-23 00:08:09

下面是一个稍微简单一点的版本:

代码语言:javascript
复制
var k = -1,
    l, tot

while(++k < n){
  l = k
  while(++l < n){
    tot += Math.abs(a[k] - a[l])
  }
}

使用es6语法也可以非常简洁地获得相同的功能,尽管我不确定哪个版本在性能方面更快。下面是一个同时包含这两种方法的fiddle

代码语言:javascript
复制
"use strict";
var a = [3, 22, 12, 99, 1, 6, 19];
var test = a.reduce((previousValue, currentValue, currentIndex, array) => {
  return previousValue + a.reduce((pv, cv, ci, arr) => {
    return ci > currentIndex ? pv + Math.abs(cv - currentValue) : pv
  }, 0)
}, 0)
console.log(test)
票数 0
EN

Stack Overflow用户

发布于 2016-02-23 00:29:15

在我看来,您正在尝试计算每个元素与其右侧所有元素之间的差值。你可以做的是计算整个数组的和,然后每次你从一个元素移动到下一个元素时,从总数中减去这个特定的数字,总差值现在就是总和-当前元素。

代码语言:javascript
复制
// Sort the array 'a' first and then run this.
int sum = calculateSum() // Write this method yourself to find total
for (int i = 0; i < n; i++)
{
    sum -= a[i];
    tot += (sum - a[i] * (n - i + 1));
}

最后一行通过考虑理想情况下减去所考虑的元素的次数,从总和中减去总差。

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

https://stackoverflow.com/questions/35557937

复制
相关文章

相似问题

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