1. 程式人生 > 其它 >LeetCode 5642. 大餐計數(map計數 + 二分查詢)

LeetCode 5642. 大餐計數(map計數 + 二分查詢)

技術標籤:LeetCode

文章目錄

1. 題目

大餐 是指 恰好包含兩道不同餐品 的一餐,其美味程度之和等於 2 的冪

你可以搭配 任意 兩道餐品做一頓大餐。

給你一個整數陣列 deliciousness ,其中 deliciousness[i] 是第 i​​​​​​​​​​​​​​ 道餐品的美味程度,返回你可以用陣列中的餐品做出的不同 大餐 的數量
結果需要對 10^9 + 7 取餘。

注意,只要餐品下標不同,就可以認為是不同的餐品,即便它們的美味程度相同。

示例 1:
輸入:deliciousness = [1,3,5,7,9]
輸出:4
解釋:大餐的美味程度組合為 (
1,3)(1,7)(3,5)(7,9) 。 它們各自的美味程度之和分別為 48816 ,都是 2 的冪。 示例 2: 輸入:deliciousness = [1,1,1,3,3,3,7] 輸出:15 解釋:大餐的美味程度組合為 3(1,1)9(1,3) ,和 3(1,7) 。 提示: 1 <= deliciousness.length <= 10^5 0 <= deliciousness[i] <= 2^20

https://leetcode-cn.com/problems/count-good-meals/

2. 解題

class
Solution { public: int countPairs(vector<int>& deliciousness) { map<int,long long> m; for(auto d : deliciousness) m[d]++;//計數 long long ans = 0, mod = 1e9+7; for(int i = 0; i <= 22; i++) { // 列舉 2的冪 int target = 1 <<
i; for(auto it = m.begin(); it != m.end() && it->first <= target/2; ++it) { int d1 = target-it->first;//另一份餐的美味程度 if(m.find(d1) == m.end())//不存在 continue; if(it->first != d1)//不相等 ans = (ans+it->second*m[d1])%mod; else//相等 Cn2 ans = (ans+m[d1]*(m[d1]-1)/2)%mod; } } return ans; } };

684 ms 58 MB C++


我的CSDN部落格地址 https://michael.blog.csdn.net/

長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!
Michael阿明