繁体   English   中英

仅显示总和小于或等于目标数的两个排列 arrays 的组合

[英]Show only the combinations of two permutated arrays that have a sum less than or equal to target number

提示:本站为国内最大中英文翻译问答网站,提供中英文对照查看,鼠标放在中文字句上可显示英文原文

我有两个 arrays: teams = [1,2,3]drivers = [4,5,6] 使用排列,我设法显示了两个 arrays 的所有组合,但设法定义了我想从每个数组中使用的值的数量。 因此,在“团队”中我使用了 1 个值,在“驱动程序”中我使用了两个。 我只想显示总和小于或等于 10 的组合,并删除所有重复项。

    teams = [1,2,3]
    drivers = [4,5,6]
    team = teams.permutation(1).to_a
    driver = drivers.permutation(2).to_a
    array = team.product(driver)
    target = 11

这是使用 1 个来自团队的数字和 2 个来自司机的数字成功输出两个 arrays 的所有组合,如下所示:

[[1], [4, 5]], [[1], [4, 6]], [[1], [5, 4]], [[1], [5, 6]], [[1], [6, 4]], [[1], [6, 5]], [[2], [4, 5]],等等...

要仅显示小于或等于 10 的值,我的预期结果将是: [[1], [4, 5]], [[1], [5, 4]],

然后没有重复会让我只剩下: [[1], [4, 5]]

我尝试添加以下代码行,但出现未定义的方法“<=”错误:

@array = array[0].product(*array[1..-1]).select { |a| a.reduce(:+) <= target }

我也试过这个但没有运气:

result = array.combination(1).select{|combi| combi.sum <= target}

@array = result

我猜这与排列有关?

teams = [1,2,3]
drivers = [2,5,4,5,6,4,5,7]
max_driver_sum = 10

我假设drivers可以包含重复元素(如我的示例),但我将在最后解释如果没有重复元素,计算将如何简化。


作为第一步,让我们在重复值和不重复值之间划分drivers

counts = drivers.tally
  #=> {2=>1, 5=>3, 4=>2, 6=>1, 7=>1}

dup_drivers, uniq_drivers = counts.partition { |_d,n| n > 1 }
                                  .map { |arr| arr.map(&:first) }​
  #=> [[5, 4], [2, 6, 7]]

所以,

dup_drivers
  #=> [5, 4]

uniq_drivers    
  #=> [2, 6, 7]

请参阅Enumerable#tallyEnumerable#partition

这里,

counts.partition { |_d,n| n > 1 } 
 #=> [[[5, 3], [4, 2]], [[2, 1], [6, 1], [7, 1]]]

首先计算两个驱动程序相等的唯一组合:

dup_combos = teams.each_with_object([]) do |t,arr|
  max_driver = (max_driver_sum - t)/2
  dup_drivers.each do |d|
    arr << [[t],[d,d]] if d <= max_driver
  end
end
  #=> [[[1], [4, 4]], [[2], [4, 4]]]

接下来,计算两个驱动程序不相等的唯一组合:

all_uniq = uniq_drivers + dup_drivers
  #=> [2, 6, 7, 5, 4]
all_uniq_combos = all_uniq.combination(2).to_a
  #=> [[2, 6], [2, 7], [2, 5], [2, 4], [6, 7], [6, 5],
  #    [6, 4], [7, 5], [7, 4], [5, 4]]
uniq_combos = teams.each_with_object([]) do |t,arr|
  adj_driver_sum = max_driver_sum - t
  all_uniq_combos.each do |combo|
    arr << [[t],combo] if combo.sum <= adj_driver_sum
  end
end
  #=> [[[1], [2, 6]], [[1], [2, 7]], [[1], [2, 5]], [[1], [2, 4]],
  #   [[1], [5, 4]], [[2], [2, 6]], [[2], [2, 5]], [[2], [2, 4]],
  #   [[3], [2, 5]], [[3], [2, 4]]]

参见数组#combination


最后一步是组合两组组合:

a1 = dup_combos + uniq_combos
  #=> [[[1], [4, 4]], [[2], [4, 4]], [[1], [2, 6]], [[1], [2, 7]],
  #    [[1], [2, 5]], [[1], [2, 4]], [[1], [5, 4]], [[2], [2, 6]],
  #    [[2], [2, 5]], [[2], [2, 4]], [[3], [2, 5]], [[3], [2, 4]]]

排序后,这个结果如下。

a1.sort
  #=> [[[1], [2, 4]], [[1], [2, 5]], [[1], [2, 6]], [[1], [2, 7]],
  #    [[1], [4, 4]], [[1], [5, 4]],
  #    [[2], [2, 4]], [[2], [2, 5]], [[2], [2, 6]], [[2], [4, 4]],
  #    [[3], [2, 4]], [[3], [2, 5]]]

请注意, Array#uniq没有在前面使用。 如果需要,当然可以替换掉上面的一些变量。


如果drivers不包含重复项,则所需数组由uniq_combos给出,其中all_uniqall_uniq_combos的计算中被drivers替换。 例如,如果

teams = [1,2,3]
drivers = [2,5,4,6,7]
max_driver_sum = 10

然后

all_uniq_combos = drivers.combination(2).to_a
  #=> [[2, 5], [2, 4], [2, 6], [2, 7], [5, 4], [5, 6],
  #    [5, 7], [4, 6], [4, 7], [6, 7]]

combos = teams.each_with_object([]) do |t,arr|
  adj_driver_sum = max_driver_sum - t
  all_uniq_combos.each do |combo|
    arr << [[t],combo] if combo.sum <= adj_driver_sum
  end
end ​
  #=> [[[1], [2, 5]], [[1], [2, 4]], [[1], [2, 6]], [[1], [2, 7]],
  #    [[1], [5, 4]], [[2], [2, 5]], [[2], [2, 4]], [[2], [2, 6]],
  #    [[3], [2, 5]], [[3], [2, 4]]]

combos.sort
  #=> [[[1], [2, 4]], [[1], [2, 5]], [[1], [2, 6]], [[1], [2, 7]],
  #    [[1], [5, 4]],
  #    [[2], [2, 4]], [[2], [2, 5]], [[2], [2, 6]],
  #    [[3], [2, 4]], [[3], [2, 5]]]

这是一种方法

teams = [1, 2, 3]
drivers = [2, 6, 5, 4]
team = teams.permutation(1).to_a
driver = drivers.permutation(2).to_a
array = team.product(driver)

target = 10

res = array.select {|i| i.map(&:sum).sum <= target}.compact
==> [[[1], [2, 6]], [[1], [2, 5]], [[1], [2, 4]], [[1], [6, 2]],
     [[1], [5, 2]], [[1], [5, 4]], [[1], [4, 2]], [[1], [4, 5]],
     [[2], [2, 6]], [[2], [2, 5]], [[2], [2, 4]], [[2], [6, 2]],
     [[2], [5, 2]], [[2], [4, 2]], [[3], [2, 5]], [[3], [2, 4]],
     [[3], [5, 2]], [[3], [4, 2]]]

获得独特的物品(修改后也适用于团队>车手的价值)

t1 = res.map {|i| i[0]}
d2 = res.map {|i| i[1].flatten.sort}

t1.zip(d2).uniq
==> [[[1], [2, 6]], [[1], [2, 5]], [[1], [2, 4]], [[1], [4, 5]],
     [[2], [2, 6]], [[2], [2, 5]], [[2], [2, 4]], [[3], [2, 5]],
     [[3], [2, 4]]]
问题未解决?试试本站强大的搜索功能,搜索: 仅显示总和小于或等于目标数的两个排列 arrays 的组合
计算数组中两个元素小于或等于总和的次数-Javascript

[英]Count number of times two elements in array are less than or equal to a sum value - Javascript

我有这个JS函数,查找两个元素等于和值的次数。 我正在尝试对此进行修改,以使条件不仅在两个元素等于和时都在,而且还小于和值时。 我将如何更改此条件var temp = sum - array[i]; 这样就说明实例temp &lt;= sum - array[i]; ? 我试 ...

查找满足条件的两个 arrays 之间的和组合数

[英]Finding the number of sum combinations between two arrays that satisfy a condition

问题: 我有 2 个 arrays A [ v ] 和M [ w ],长度分别为v和w 。 给定两个数字p和q ,我想找出这些 arrays 的两个元素之和有多少组合满足以下条件: p &gt;= A [ v ] + M [ w ] &lt;= q 一个例子: 让: 由于以下组合,答案将是 5: ...

两个排序数组,两个元素之和等于一定数目

[英]Two Sorted Arrays, sum of 2 elements equal a certain number

我想知道是否能得到一些帮助。 我想找到一种THETA(n)或线性时间的算法,用于确定2个排序数组中的2个数字是否加起来等于某个数字。 例如,假设我们有2个排序的数组:X和Y 我想确定是否存在一个X元素和一个Y元素,它们的总和恰好等于某个数字,例如50。 到目前为止,我已经能够 ...

如何找到总和等于或小于给定数量的元组数?

[英]How to find number of tuples whose sum is equal or less than a given number?

我正在设计一种算法来查找总和等于或小于给定数量的元组数。 我知道使用LinkedList解决它的其他方法,所以,不寻找那个解决方案。 我只想遍历数组并计算满足关系的可能匹配。 我到目前为止, 这不提供正确的解决方案,例如,如果我传递数组和数字如下, 正确的解决方案将是15对 ...

返回两个不同的 arrays 中的两个元素相差 2 或更少但不相等的次数的计数

[英]Return the count of the number of times that the two elements in two different arrays differ by 2 or less, but are not equal

当我在编码 bat 上练习 Java 问题时,我遇到了以下问题陈述。 问题:- 给定两个长度相同的 arrays nums1 和 nums2,对于 nums1 中的每个元素,考虑 nums2 中的对应元素(在相同的索引处)。 返回两个元素相差 2 或更少但不相等的次数。 例子:- 我的解决方案:- ...

总和小于给定总和的最大子集

[英]Largest Subset whose sum is less than equal to a given sum

列表定义如下: [1, 2, 3] 其子列表是: 给定 K,例如 3,任务是找到元素总和小于等于 k ​​的最大长度的子列表。 我知道 python 中的itertools但它会导致较大列表的分段错误。 有没有其他有效的算法来实现这一目标? 任何帮助,将不胜感激。 我的代码是允许的: ...

Java - 在排序数组中查找总和小于数字的三个数字的所有组合

[英]Java - find all combinations of three numbers in sorted array that have a sum smaller than a number

标题很拗口,所以我将进一步解释。 这是我的计算机科学课程入门练习测试中的一个问题。 大多数问题我都能自己解决或在网上找到解决方案,但不是针对这个问题。 您将获得一个唯一整数(正数和负数)的排序数组 ( int[] arr )。 您必须找出有多少三元组(数组中三个数字的组合)的总和小于给定数字( in ...

找到等于输入的两个 arrays 元素之和

[英]finding the sum of two arrays elements that is equal to the input

试图遍历一个数组以找到两个总和等于目标的数组项,不知道为什么不工作 const numsArr = [2,7,11,15] const numTarget = 9 const twoSum = function(nums, target) { const first = 0; const secon ...

暂无
暂无

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

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