前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >LeetCode 1711. 大餐计数(map计数 + 二分查找)

LeetCode 1711. 大餐计数(map计数 + 二分查找)

作者头像
Michael阿明
发布2021-02-19 14:40:30
发布2021-02-19 14:40:30
42100
代码可运行
举报
运行总次数:0
代码可运行

文章目录

1. 题目

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

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

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

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

代码语言:javascript
代码运行次数:0
复制
示例 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) 。
 
提示:
1 <= deliciousness.length <= 10^5
0 <= deliciousness[i] <= 2^20

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

2. 解题

代码语言:javascript
代码运行次数:0
复制
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++


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/01/03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档