找到数组中所有对的最小差的总和

Posted

技术标签:

【中文标题】找到数组中所有对的最小差的总和【英文标题】:Find the sum of all the minimum differences of pairs in array 【发布时间】:2020-07-28 22:38:20 【问题描述】:

假设输入数组是偶数长度,我想找出所有最近邻对之间的差异并将它们求和。

我现在有这个代码,但它只给出了一对的最小差异。 我该如何实现这一目标?所以取出已经相加的对,和其余的对一起计算。

 var lowestDiff = Infinity;
arr.sort((a, b) => a - b);
for (var i = 0; i < arr.length - 1; i++) 
    lowestDiff = Math.min(lowestDiff, Math.abs(arr[i] - arr[i + 1]));

   console.log(lowestDiff);

例如,如果输入为:[6,2,3,6],则输出为:1,因为 6 对与 6,2 对与 3

所以本质上我想将一个元素与另一个最接近它们的元素配对,并获得差异。并将它们相加。

【问题讨论】:

由于问题不清楚,请提供更多示例。 假设输入总是偶数@YevgenGorbunkov @saurabhsisodia 现在更清楚了吗? 考虑到,您说 '...所有可能的对...' 您的示例结果不应该是 13 (6-2 + 2-3 + 6-3 + 6-3 + 6-2 + 6-6) ? @YevgenGorbunkov 不,因为一个元素只能在一对中 - 他最近的邻居 【参考方案1】:

因为您需要从偶数长度的数组中找到最小差对的总和。 需要注意的一件事: 这里是: 对给定数组进行排序后,最接近的对将彼此相邻 所以,我认为下面的代码应该可以工作

function min_difference(arr)

       arr.sort(function(a, b) 
          return a - b;
                );
       let ans=0;
       for (let i=1;i<arr.length;i+=2)
      
          ans+=(arr[i]-arr[i-1]);
      
       return ans;

var arr=[2,2,2,2];
console.log(min_difference(arr));

【讨论】:

解释很好,但是the sorting does not work 我建议使用for 循环而不是while 循环。 @Bergi 非常感谢。我已经更新了我的答案。 @saurabhsisodia : Math.abs() 在上述情况下似乎只对事情有用:放慢你的代码并使其更加冗长。只要您的项目按升序排序,它们之间的差异无论如何都是正数(或 0)。另外,我建议将该代码块包装到将返回ans 而不是console.log() 的函数中。你也可以考虑把你的代码变成 live-sn-p。 @saurabhsisodia :你应该做一些类似function min_difference(arr).. 的事情,不是吗?

以上是关于找到数组中所有对的最小差的总和的主要内容,如果未能解决你的问题,请参考以下文章

如何从数组中找到精确的(最小)元素以匹配给定的总和

在数组中找到两个总和最小的非后续元素

如何找到从多个数组中提取的数字的最小总和?

最小唯一数组总和

如何更有效地从n组中找到满足给定条件的最小组合?

求数组所有区间最大值减去最小值之差的和(贝壳笔试题)