题目:
大餐 是指 恰好包含两道不同餐品 的一餐,其美味程度之和等于 2 的幂。
你可以搭配 任意 两道餐品做一顿大餐。
给你一个整数数组 deliciousness ,其中 deliciousness[i] 是第 i 道餐品的美味程度,返回你可以用数组中的餐品做出的不同 大餐 的数量。结果需要对 109 + 7 取余。
注意,只要餐品下标不同,就可以认为是不同的餐品,即便它们的美味程度相同。
算法:
方法一:hash table
这个变体题目的算法也太牛了
func countPairs(deliciousness []int) int {
maxVal := -1
mod := 1000000007
for i := range deliciousness {
if deliciousness[i] > maxVal {
maxVal = deliciousness[i]
}
}
ans := 0
numCount := make(map[int]int, 0)
maxSum := 2 * maxVal
for i := range deliciousness {
for n := 1; n <= maxSum; n = n << 1 {
ans = ans + numCount[n - deliciousness[i]]
}
numCount[deliciousness[i]] ++
}
return ans % mod
}