【问题标题】:How to pick elements from both arrays so that the difference between the sum is the minimum如何从两个数组中选择元素,以使总和之间的差异最小
【发布时间】:2020-05-17 02:23:12
【问题描述】:

有两个数组的长度相同。

数组 A = 一组非负整数

数组 B = 一组非正整数

我必须为每个索引 i 选择 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。

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

【问题讨论】:

  • 我认为您需要选择...而不是每个 i 的 A[i] 或 B[i]。在您的问题中添加 n 和值范围的约束

标签: arrays algorithm dynamic-programming


【解决方案1】:

这可以在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('');
}

【讨论】:

  • 在最坏的情况下 num_diffs 不是 2^n 吗?这也是指数的
  • @Tuto 我的理解是差异的数量取决于值可以采用的范围。
猜你喜欢
  • 1970-01-01
  • 2019-06-27
  • 1970-01-01
  • 2016-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-27
  • 1970-01-01
相关资源
最近更新 更多