找到数组中所有对的最小差的总和
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)..
的事情,不是吗?以上是关于找到数组中所有对的最小差的总和的主要内容,如果未能解决你的问题,请参考以下文章