数组中任意两个数字的总和与另一个数字相等

时间:2017-03-08 13:03:58

标签: ruby-on-rails arrays ruby rake-task

我有两个数组,array1array2。我想检查array1中是否有任何2个不同的数字,以便它们的总和是array2中的另一个不同数字。这是我尝试过的,但它似乎并不像我想要的那样完全正常工作。

array1.each do |k|
  array1.each do |l|
    array2.each do |m|
      if k + l == m
        # do something with k, l, m
      end
    end
  end
end

2 个答案:

答案 0 :(得分:0)

您可以选择两次相同的号码。阿卡与

array1 = [1]
array2 = [2]

您将获得2 == 1 + 1。为避免这种情况,您可以使用Array#combination

array1.combination(2).select { |x, y| array2.include? x + y }.each do |x, y|
  # do something with x, y and x + y
end

答案 1 :(得分:0)

我们只是想知道m+n是否是第二个数组的元素,其中mn是第一个数组的 distinct 元素(我认为这意味着m != n),我们将要使用Emumerable#any?

require 'set'

def any_pair?(arr1, arr2)
  set = arr2.to_set
  arr1.uniq.combination(2).any? { |n,m| set.include?(n+m) }
end

any_pair? [3,1,6,1,4], [1,2,6,7]
  #=> true
any_pair? [3,1,6,1,4], [1,2,6]
  #=> false

我们需要检查arr1中两个值的总和是arr2的成员,最多n*(n-1)次,其中narr1.size。我们可以使用Array#include?,但是通过将arr2转换为集合作为初始步骤,可以提高此操作的效率。设置成员资格查找(实现为哈希查找)非常快。

如果我们希望返回arr1的所有不同元素对,其总和是arr2的成员,则该方法将更改为以下内容。

def all_pairs(arr1, arr2)
  set = arr2.to_set
  arr1.uniq.combination(2).select { |n,m| set.include?(n+m) }
end

all_pairs [3,1,6,1,4], [1,2,6,7]
  #=> [[3, 4], [1, 6]] 
all_pairs [3,1,6,1,4], [1,2,6]
  #=> []