【问题标题】:Simplify calculating difference between every element and the elements to its right简化计算每个元素与其右侧元素之间的差异
【发布时间】:2016-02-22 15:48:49
【问题描述】:

我可以让它更简单吗?

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

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

【问题讨论】:

  • n 有多大?你到底想完成什么。在不知道最终结果的情况下尝试优化此代码是没有意义的。也许你在做这件事完全错了,有一些更简单的东西可以得到你想要的。
  • 它应该是 C++。
  • 您可以将max(a[k],a[l])-min(a[k],a[l]) 替换为abs(a[k] - a[l])。如需更多改进,我们需要了解您的实际需求
  • 我试图检查数组 a[n] 的所有 2 个元素之间的差异,而且我只给出了太正的值:(max(a[k],a[l]) -min(a[k],a[l])

标签: loops for-loop nested


【解决方案1】:

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

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)

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-21
      • 1970-01-01
      • 1970-01-01
      • 2022-08-03
      相关资源
      最近更新 更多