Точно так же, как @stefan упоминается в комментариях к одному из постов.
Вы также можете создать частотный хеш, чтобы избежать многократного обхода массива.
Чтоэто означает:
frequency_map = Hash.new{|h,k| h[k] = 0 }
array2.each{ |number| frequency_map[number] += 1 }
frequency_map
#=> {1=>2, 2=>2, 3=>2, 4=>1, 5=>1, 6=>1, 7=>1, 8=>1, 9=>1, 10=>1, 11=>1, 12=>1}
Как вы можете видеть выше, у нас есть частота каждого числа в массиве 2 только из одной итерации, то есть O (n) времени, но имеет O (n) пространственную сложность.
Из приведенной частоты мы можем легко определить количество раз, которое array1
появилось в array2
:
frequency_of_array1 = nil
array1.each do |number|
if frequency_of_array1.nil?
frequency_of_array1 = frequency_map[number]
else
frequency_of_array1 = frequency_of_array1 > frequency_map[number] ? frequency_map[number] : frequency_of_array1
end
end
frequency_of_array1 #=> 2
Или просто так (но построить другой массив / пространство - которого избегаливыше):
array1.map{ |num| frequency_map[num] }.min