📜  门|门CS 2008 |第 47 题(1)

📅  最后修改于: 2023-12-03 15:28:48.703000             🧑  作者: Mango

题目概述

本题来自于 AC 牛客,题目编号为“门 | 门CS 2008 | 第 47 题”。

题目描述

给定一个大小为 $N$ 的无序整数数组 $a$,请找出其中的两个数并输出它们的和等于 $M$ 的个数。

输入格式

第一行包含两个整数 $N$ 和 $M$。

第二行包含 $N$ 个整数 $a_1,a_2,\cdots,a_n$。

输出格式

一个整数,表示和为 $M$ 的数对个数。

数据范围

$1 \leqslant n \leqslant 10^5$,

$1 \leqslant a_i,M \leqslant 10^9$,所有数均为正整数。

示例
输入示例
6 9
3 1 4 2 7 5
输出示例
2
解题思路

采用哈希表计数法。因为题干中要求输出的是数对个数,所以在遍历数组时,应当记录每个数出现的次数。在处理每一个数时,我们首先判断在哈希表中是否存在另一个数能够与它相加等于 $M$,如果存在,那么就将它们能够组成数对的数量累加到答案中。最后返回统计的次数即可。

而关于哈希表计数,本人在解析第 446 题“数组元素的目标和”的时候已有详细讲解,有需要的同学可以到题解区查看。

代码实现

时间复杂度 $O(n)$。

def pair_sum_equal_to_m(n: int, m: int, a: List[int]) -> int:
    freq = {}
    cnt = 0
    for i in a:
        if m - i in freq:
            cnt += freq[m - i]
        freq[i] = freq.get(i, 0) + 1
    return cnt