繁体   English   中英

如何从 arrays 中选择元素,使总和之间的差异最小

[英]How to pick elements from both arrays so that the difference between the sum is the minimum

有 2 个 arrays,其中两个 arrays 的长度相同。

数组 A = 一组非负整数

数组 B = 一组非正整数

对于每个索引 i,我必须要么 select A[i] 要么 B[i] 并且想知道 abs(sum) 的最小值。

例如

示例 1

A = {1,2,3,4},B = {-1,-2,-3,-4}

那么通过选择 1、-2、-3 和 4,abs(sum) 的最小值将为 0。(-1、2、3、-4)也可以。

示例 2

A = {1,1,1,3},B = {0,0,0,-3}

那么通过选择 1,1,1 和 -3,abs(sum) 的最小值将为 0。

我只能想到一种天真的方法来计算需要指数时间的所有可能组合。 有没有更好的方法来解决这个问题?

这可以在O(n * num_diffs)时间复杂度内完成,方法是想象负数桶只是我们试图尽可能接近另一个正数桶的另一个正数桶。

JavaScript 代码( diff是放置一个桶时产生的差异):

 function f(A, B){ let diffs = new Set(); diffs.add(A[0]); diffs.add(-B[0]); for (let i=1; i<A.length; i++){ let newDiffs = new Set(); for (d of [...diffs]){ newDiffs.add(d + A[i]); newDiffs.add(Math.abs(d + B[i])); } diffs = newDiffs; } console.log(`Diffs: ${ [...diffs] }`); return Math.min(...diffs); } var ABs = [ [[1, 2, 3, 4], [-1, -2, -3, -4]], // 0 [[1, 1, 1, 3], [0, 0, 0, -3]] // 0 ] for (let [A, B] of ABs){ console.log(`A: ${ A }`); console.log(`B: ${ B }`); console.log(`Result: ${ f(A, B) }`); console.log(''); }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM