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

时间:2016-02-22 15:48:50

标签: loops for-loop nested

我可以让它更简单吗?

 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]));
 }

该计划目前正在花费更多时间执行并超过时限。

2 个答案:

答案 0 :(得分:0)

这是一个稍微简单的版本:

var k = -1,
    l, tot

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

使用es6语法也可以非常简洁地获得相同的功能,但我不确定哪个版本的性能更快。这是一个fiddle并列两种方法。

"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)

答案 1 :(得分:0)

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

// 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));
}

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