下班之后扫了一眼leetcode,又发现一道类似两数之和的中等题,一看数据最大为2的20次方,也就是说两个数加起来最多2的21次方,我可以先把2的0次方到21次方全部先算出来,再一个个模拟,即使数组中每个数字只有一个,最坏的时间复杂度也只有22乘以100000,也就是2200000,刚好处在擦边通过的边缘,可是这次Ruby已升级至3.2版本,引入了yjit,快了许多,于是一把过了。
1711. 大餐计数
# @param {Integer[]} deliciousness
# @return {Integer}
def count_pairs(deliciousness)
d1 = (0..21).map {|i| 2.pow(i)}
h2 = Hash.new(0)
deliciousness.each do |d|
h2[d] += 1
end
cnt = 0
d1.each do |d2|
h2.each_key do |k1|
if h2.has_key?(d2-k1) && d2-k1 != k1
cnt += h2[d2-k1]*h2[k1]
elsif h2.has_key?(d2-k1) && d2-k1==k1
if h2[k1] > 1
cnt += h2[k1]*(h2[k1]-1)
end
end
end
end
(cnt/2)%(10**9+7)
end