【问题标题】:How do I pick elements from two arrays such that the sum is minimum?如何从两个数组中选择元素以使总和最小?
【发布时间】:2020-04-05 13:02:43
【问题描述】:

我有两个长度相等的数组,可以选择array1或array2,求和的输出必须是最小的。但是,我从 array1 中选择元素的次数必须与我从 array2 中选择的次数相同。

例子:

array1 = [2, 3, 5, 1]

array2 = [1, 2, 3, 2]

输出将是 8,因为:

At index0: I picked 2 from array1.
At index1: I picked 2 from array2.
At index2: I picked 3 from array2.
At index3: I picked 1 from array1.

我目前的方法:我根据 array1 上的元素对数组进行排序。所以我在 index0 和 index1 处选择了 array1,然后在 index2 和 index3 处选择了 array2。

排序后的示例:

array1 = [1, 2, 3, 5]

array2 = [2, 1, 2, 3]

At index0: I picked 1 from array1.
At index1: I picked 2 from array1.
At index2: I picked 2 from array2.
At index3: I picked 3 from array2.

但是,当数组是这样的时候,我可能会遇到问题:

array1 = [2, 3, 5, 1]

array2 = [1, 7, 6, 2]

根据array1排序后:

array1 = [1, 2, 3, 5]

array2 = [2, 1, 7, 6]

At index0: I picked 1 from array1.
At index1: I picked 2 from array1.
At index2: I picked 7 from array2.
At index3: I picked 6 from array2.

当理想的解决方案是:

At index0: I picked 2 from array2.
At index1: I picked 1 from array2.
At index2: I picked 3 from array1.
At index3: I picked 5 from array1.

有人可以帮我解决这个问题吗?谢谢。

【问题讨论】:

  • 目前还不清楚如何从数组中挑选元素。
  • 假设有 2 个数组,a[i] 和 b[i]。我必须根据 2 个数组的输入输出最小的和数。但是,从 a[i] 中选取元素的次数必须与 b[i] 相同。示例:左侧是 a[i] 的输入,右侧是 b[i] 2 1, 3 2, 5 3, 1 2 的输入。输出将是 8。因为我在索引 0 处选择了 a[i], b[i] 在索引 1 和 2 处,a[i] 在索引 3 处,它给出最小的和值。
  • 数组第一个例子的最小和是array1[3] + array2[0]
  • 不,假设如果array1 和array2 有4 个输入,我必须从array1 和array2 中选择2 个输入。所以它将是 a[0] + b[1] + b[2] + a[3] = 8,这将给出最小的总和值。
  • 据我了解:对于每个索引,您必须从 array1 或 array2 中进行选择,但 array1 的最终选择计数应该与 array2 中的计数相同。

标签: algorithm sorting


【解决方案1】:

计算差值array1 - array2:

array1 = [2, 3, 5, 1]
array2 = [1, 2, 3, 2]

diff   = [1, 1 ,2, -1]
index  = [0, 1, 2, 3]

排序(并记住索引):

sorted_diff: [-1, 1, 1, 2]
index2     : [ 3, 0, 1, 2]
            array1 | array2

你必须对数组的一半取反才能得到最小的总和。所以index1,index2来自array2。

示例2:

array1 = [2, 3, 5, 1]
array2 = [1, 7, 6, 2]

diff   = [1, -4 ,-1, -1]
index  = [0, 1, 2, 3]

sorted = [-4, -1, -1, 1]
index2 = [ 1, 2, 3, 0]
        array1 | array2

所以取自array2 index3, index0。

【讨论】:

  • 所以,负 diff -> array1 的元素小于 array2 的元素。 (正差异 - 相反。)对差异数组进行排序会将索引从数组 1 中选择到前面,将索引从数组 2 中选择到后面。我需要一段时间才能了解您的解决方案如何/为什么起作用...... ;-)
  • 嘿,这真的很有帮助!非常感谢!
猜你喜欢
  • 2019-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 1970-01-01
  • 2022-07-11
相关资源
最近更新 更多