对于短阵列,以下功能运行良好。它应该返回第一个数组对,其中和是等于给定的整数。但是,如果数组的长度超过1000万个元素,则请求超时,因为(我认为)在第一行中创建的变量中存储了数千个值。我知道我必须使用memoization(|| =)但不知道如何使用它。
array1 = [1,2,3,4,5,6,7]
number = 3
array2 = [1,2,3.....n] # millions of elements
combos = array1.combination(2).to_a
(combos.select { |x,y| x + y == number }).sort.first
我需要收集所有可能的对来对它们进行排序,我使用select遍历整个列表而不是停在第一对返回true的对。
答案 0 :(得分:1)
这是可能的解决方案之一。
def sum_pairs(ints, s)
seen = {}
for i in ints do
return [s-i, i] if seen[s-i]
seen[i] = true
end
nil
end
答案 1 :(得分:0)
def find_smallest(arr, nbr)
first, *rest = arr.sort
until rest.empty?
matching = rest.bsearch { |n| n == nbr - first }
return [first, matching] unless matching.nil?
first, *rest = rest
end
nil
end
arr = [12, 7, 4, 5, 14, 9]
find_smallest(arr, 19) #=> [5, 14]
find_smallest(arr, 20) #=> nil
我使用方法Array#bsearch(而不是Enumerable#find来加速搜索等于nbr - first
(O(log rest.size
)与O的元素(rest.size
))。