📅  最后修改于: 2023-12-03 15:12:37.741000             🧑  作者: Mango
本题来自门| GATE CS 2021 |设置 2 |第 43 题,题目描述如下:
给定两个数组 a
和 b
,数组元素均为正整数且已按升序排序。现在你需要找出两个数组中所有元素的对数,使得两个元素的和恰好为 k
。请实现一个 Python
函数 countPairs(a: List[int], b: List[int], k: int) -> int
,返回所有满足条件的数对的个数。
【样例输入】
countPairs([1, 2, 3], [4, 5, 6], 6)
【样例输出】
2
【样例输入】
countPairs([1, 1, 2, 3], [1, 1, 3, 3], 4)
【样例输出】
9
由题目描述可以看出,本题需要找到每个数组中所有与另一个数组中元素的和为 k
的数对。因此,本题可以采用两个指针分别指向输入的两个数组的开头,然后逐个进行比较。
具体地,我们首先设定两个指针 i
和 j
,分别指向 a
和 b
的起始位置。接下来,我们进行如下循环:
a[i] + b[j] = k
,则将结果计数器加一,并将指针向后移动,寻找下一个数对;a[i] + b[j] < k
,则将指针 i
向后移动,以便寻找更大的 a[i]
;a[i] + b[j] > k
,则将指针 j
向后移动,以便寻找更小的 b[j]
。这样,当两个指针分别指向输入数组的末尾时,整个数组就被扫描完毕,返回结果计数器即可。
下面是Python代码实现,该函数接受三个参数,分别为两个输入数组 a
和 b
,以及需要判断的目标和 k
。
from typing import List
def countPairs(a: List[int], b: List[int], k: int) -> int:
i = 0
j = len(b) - 1
count = 0
while i < len(a) and j >= 0:
if a[i] + b[j] == k:
count += 1
i += 1
j -= 1
elif a[i] + b[j] < k:
i += 1
else:
j -= 1
return count
由于算法仅遍历了两个输入数组一次,因此其时间复杂度为 $O(n+m)$,其中 $n$ 和 $m$ 分别是两个数组的长度。此外,算法仅用到了有限的额外空间,主要用来存储计数器以及两个指针,因此其空间复杂度为 $O(1)$。