我可以让它更简单吗?
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]));
}
该计划目前正在花费更多时间执行并超过时限。
答案 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));
}
最后一行通过考虑理想情况下减去所考虑元素的次数,从总和中减去总差异。