📅  最后修改于: 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