【2025刷题笔记】- 二元组个数

刷题笔记合集🔗

二元组个数

问题描述

小柯有两个数组 ,若 则称 为一个二元组,求在给定的两个数组中,二元组的个数。

输入格式

第一行输入 。 第二行输入 个数,表示第一个数组。

第三行输入 。 第四行输入 个数,表示第二个数组。

输出格式

二元组个数。

样例输入

4
1 2 3 4
1
1
6
1 1 2 2 4 5
3
2 2 4

样例输出

1
5

数据范围

  • 数组长度不超过
  • 数组元素为整数
样例 解释说明
样例1 二元组个数为1个。, ,组成一个二元组
样例2 二元组个数为5个。 中有两个1, 中有零个1; 中有两个2, 中有两个2; 中有一个4, 中有一个4; 中有一个5, 中有零个5。所以二元组个数为 个。

题解

这道题目要求计算两个数组中能形成的二元组个数,其中二元组定义为数组 和数组 中相同值的元素对

思路分析

最直接的解法是使用双重循环,遍历数组 和数组 的每一个元素,统计满足 的对数。

但是当数据规模较大时,双重循环的时间复杂度为 ,可能导致超时。因此,我们可以采用更高效的哈希表方法。

优化的方法是:

  1. 统计两个数组中共同存在的元素
  2. 分别计算这些元素在两个数组中的出现次数
  3. 对于每个共同元素,其形成的二元组数量为该元素在数组 中的出现次数乘以在数组 中的出现次数

具体步骤

  1. 将数组 和数组 的元素分别放入集合 中,用于快速查找共同元素
  2. 遍历数组 ,统计每个在 中出现的元素的次数到
  3. 遍历数组 ,统计每个在 中出现的元素的次数到
  4. 遍历 中的每个元素,将其出现次数与 中对应元素的出现次数相乘,累加得到最终结果

时间复杂度分析

  • 构建集合和统计元素频次的时间复杂度为
  • 最终计算二元组个数的时间复杂度为 ,其中 是共同元素的个数,一般远小于

这种方法的总时间复杂度为 ,相比于双重循环的 ,大大提高了效率,适合处理题目给出的数据规模。

参考代码

  • Python
import sys
input = lambda:sys.stdin.readline().strip()

# 读取输入
m = int(input())
a_arr = list(map(int, input().split()))

n = int(input())
b_arr = list(map(int, input().split()))

def count_pairs():
    """计算二元组个数"""
    # 创建两个数组的元素集合
    a_set = set(a_arr)
    b_set = set(b_arr)
    
    # 统计a数组中元素出现次数
    a_count = {}
    for val in a_arr:
        # 只统计b_set中存在的元素
        if val in b_set:
            a_count[val] = a_count.get(val, 0) + 1
    
    # 统计b数组中元素出现次数
    b_count = {}
    for val in b_arr:
        # 只统计a_set中存在的元素
        if val in a_set:
            b_count[val] = b_count.get(val, 0) + 1
    
    # 计算二元组总数
    total = 0
    for val in a_count:
        # 每个共同值的二元组数量 = a中出现次数 × b中出现次数
        total += a_count[val] * b_count[val]
    
    return total

# 输出结果
print(count_pairs())
  • Cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
    // 读取输入
    int m;
    cin >> m;
    vector<int> a(m);
    for (int i = 0; i < m; i+

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

算法刷题笔记 文章被收录于专栏

本专栏收集并整理了一些刷题笔记

全部评论

相关推荐

昨天 14:49
牛客运营
1.&nbsp;技术栈审计报告:🔸需至少连续三年以上在ACM/Kaggle竞赛履历,包含但不限于:ACM区域赛金牌、Kaggle&nbsp;Master、Codeforces红名(注:培训班批量产出项目除外,培训班out)🔸能清晰阐释Transformer与CNN的本质区别,并有过至少一次在实验室通宵调参后对导师说出“模型loss还在下降,我觉得还能抢救”的可验证经历(附服务器监控截图与终端对话记录)2.&nbsp;开发能力证明:🔸精通Vim盲打,能在无图形界面的服务器上完成内核编译,且记得住所有Git指令的完整参数🔸可同时应对产品经理需求变更、线上服务告警、测试环境崩溃而不产生物理性砸键盘冲动🔸曾在凌晨四点的机房就着服务器轰鸣声,蹲在机柜旁用手机热点连VPN修复生产环境数据3.&nbsp;生存状态白皮书:🔸每日咖啡因摄入≥400mg(手冲/冷萃优先,但更多时候是速溶粉干嚼)🔸平均睡眠时长≤5小时,其中包含在工位午休的15分钟浅眠🔸年均加班时长>800小时,并认为“关机重启”是解决人际关系的终极方案🔸能在分析家庭矛盾时自然画出系统架构图,用敏捷开发流程比喻亲子沟通模式🔸口头禅需包含“这个需求不符合第一性原理”、“容我先做个压力测试”、“你这段感情输出的日志不够结构化”4.&nbsp;技术面经反思录:🔸一篇需说明:Why&nbsp;not&nbsp;转管理?Why&nbsp;not&nbsp;逃离互联网?🔸另一篇需阐述当产品说“借鉴下竞品功能”,你如何用左耳听需求,右手写违心代码5.&nbsp;代码遗产集:🔸附某个深夜提交的commit记录(≥30次revert仍坚持push,含至少三次“Fix&nbsp;previous&nbsp;fix”的史诗级操作)🔸可选附加项:你为前任写的自动化分手脚本,集成情绪分析模型与财产分割算法6.&nbsp;精神能耗采样:🔸需提供至少一条深夜技术论坛发言截图如《递归函数与代际创伤的相似性研究》、《当父母说“找个稳定工作”,我该如何进行多线程谎言维护》🔸服务器监控曲线中标注出:CPU使用率峰值与泪崩时间点高度重合的物理证据(注:所有材料需以JSON格式提交,附带SHA-256校验码,我们将通过AST抽象语法树解析你的情感模块是否仍存在技术债)参考文献:[1]&nbsp;凌晨四点半的海《当文艺女开始谈论原生家庭》2025.[2]《文艺女和我讲原生家庭需要以下材料》2025.小红书[3]&nbsp;豆包
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务