1711. 大餐计数

98 阅读1分钟

题目:
大餐 是指 恰好包含两道不同餐品 的一餐,其美味程度之和等于 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
}