数组中任意两个数的总和等于另一个数

Sum of any two numbers in array equal number from another

我有两个数组,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

您可能会选择同一个号码两次。又名

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

因为我们只想知道 m+n 是否是第二个数组的元素,其中 mndistinct 元素对于第一个数组(我假设是 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 转换为集合作为初始步骤,可以使此操作更加高效。集合成员查找(作为散列查找实现)非常快。

如果我们希望 return 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]
  #=> []