统计匹配的二元组个数

题目描述

给定两个数组A和B,若数组A的某个元素A[i]与数组B中某个元素B[j]满足 A[i] == B[j],则寻找到一个值匹配的二元组(i,j)。 请统计在这两个数组A和B中,一共存在多少个这样的二元组。

输入描述

第一行输入数组A的长度M,

第二行输入数组B的长度N,

第三行输入数组A的值,

第四行输入数组B的值。

输出描述

输出匹配的二元组个数

备注

  • 若不存在相等的值,则输出0。
  • 所采用的算法复杂度需小于O(N^2),否则会超时。
  • 输入数组中允许出现重复数字,一个数字可以匹配多次。

用例1

输入

解释

5 4 1 2 3 4 5 4 3 2 1

Copy

输出

4

Copy

说明

若下标从0开始,则匹配的二元组分别为(0,3),(1,2),(2,1),(3,0),共计4个

用例2

输入

解释

6 3 1 2 4 4 2 1 1 2 3

Copy

输出

4
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;

int main()
{
    int a;
    int b;
    cin >> a;
    cin.ignore(); // 忽略换行符
    cin >> b;

    vector<int> v_a(a);
    vector<int> v_b(b);

    for(int i = 0; i < a; i++)
    {
        cin >> v_a[i];
    }

    for(int i = 0; i < b; i++)
    {
        cin >> v_b[i];
    }

    unordered_map<int, int> count_map;

    // 计算 v_a 中每个元素的出现次数
    for(const int &x : v_a)
    {
        count_map[x]++;
    }

    int count = 0;

    // 遍历 v_b,检查每个元素是否在 count_map 中,是则累加计数
    for(const int &x : v_b)
    {
        if(count_map.find(x) != count_map.end())
        {
            //对应值累加到count上
            count += count_map[x];
        }
    }

    cout << count << endl;

    return 0;
}

 

Copy

说明

若下标从0开始,则匹配的二元组分别为(0,0),(1,1),(4,1),(5,0) 共计4个。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值