LeetCodeDiary

A Diary for solving LeetCode problems

View on GitHub

1711. 大餐计数

大餐 是指 恰好包含两道不同餐品 的一餐,其美味程度之和等于 2 的幂。

你可以搭配 任意 两道餐品做一顿大餐。

给你一个整数数组 deliciousness ,其中 deliciousness[i] 是第 i 道餐品的美味程度,返回你可以用数组中的餐品做出的不同 大餐 的数量。结果需要对 109 + 7 取余。

注意,只要餐品下标不同,就可以认为是不同的餐品,即便它们的美味程度相同。

示例 1:

输入:deliciousness = [1,3,5,7,9]
输出:4
解释:大餐的美味程度组合为 (1,3) 、(1,7) 、(3,5) 和 (7,9) 。
它们各自的美味程度之和分别为 4 、8 、8 和 16 ,都是 2 的幂。

示例 2:

输入:deliciousness = [1,1,1,3,3,3,7]
输出:15
解释:大餐的美味程度组合为 3 种 (1,1) ,9 种 (1,3) ,和 3 种 (1,7) 。

提示:

中等 哈希表

代码

我的代码就是最吼滴

class Solution:
    def __init__(self):
        self.MAX_SIZE = int(1e9 + 7)
        self.POWER_OF_TWO = [1]
        for _ in range(20):
            self.POWER_OF_TWO.append(self.POWER_OF_TWO[-1]*2)

    def countPairs(self, deliciousness: List[int]) -> int:

        counter = Counter(deliciousness)
        max_key = max(deliciousness)
        ans = 0
        key_list = list(counter.keys())
        for key in key_list:
            value = counter[key]
            for power2 in self.POWER_OF_TWO:
                if power2 - key > max_key:
                    break
                if power2 < key:
                    continue
                if key == power2:
                    ans +=  int(comb(counter[key],2)) % self.MAX_SIZE
                if key != power2 - key:
                    ans += value * counter[power2-key] % self.MAX_SIZE
            del(counter[key])
        return ans % self.MAX_SIZE