📜  门| GATE CS 2021 |设置 2 |第 43 题(1)

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

门| GATE CS 2021 |设置 2 |第 43 题

本题来自门| GATE CS 2021 |设置 2 |第 43 题,题目描述如下:

给定两个数组 ab,数组元素均为正整数且已按升序排序。现在你需要找出两个数组中所有元素的对数,使得两个元素的和恰好为 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 的数对。因此,本题可以采用两个指针分别指向输入的两个数组的开头,然后逐个进行比较。

具体地,我们首先设定两个指针 ij,分别指向 ab 的起始位置。接下来,我们进行如下循环:

  • 若当前 a[i] + b[j] = k,则将结果计数器加一,并将指针向后移动,寻找下一个数对;
  • 若当前 a[i] + b[j] < k,则将指针 i 向后移动,以便寻找更大的 a[i]
  • 若当前 a[i] + b[j] > k,则将指针 j 向后移动,以便寻找更小的 b[j]

这样,当两个指针分别指向输入数组的末尾时,整个数组就被扫描完毕,返回结果计数器即可。

代码实现

下面是Python代码实现,该函数接受三个参数,分别为两个输入数组 ab,以及需要判断的目标和 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)$。