📜  门| GATE-CS-2009 |问题 15(1)

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

题目描述

给定整数数组 arr 和整数 X,找到其中一组数,使得它们的和等于 X。数组中的每个元素最多只能使用一次。如果存在多个解,则返回任意一个。

实现函数:

def find_pair(arr: List[int], X: int) -> List[int]:
    pass
输入
  • arr:长度为 $n$ 的整数数组 $(1 \leq n \leq 10^5)$,数组中的元素大小均不超过 $10^5$。
  • X:整数 $(1 \leq X \leq 2 \cdot 10^5)$。
输出
  • [a, b]:返回两个整数的列表,满足 $a+b = X$。如果不存在这样的数对,则返回 []
思路

首先将数组排序,然后使用双指针,一个指向数组的起始位置,一个指向数组的末尾位置。如果两个指针所指向的数字之和等于 X,则返回这两个数字;如果两个数字之和小于 X,则将左指针向右移动;如果两个数字之和大于 X,则将右指针向左移动。直到找到满足要求的数字对,或者左右指针相遇。

时间复杂度为 $O(n \log n)$,空间复杂度为 $O(1)$。

代码实现
from typing import List


def find_pair(arr: List[int], X: int) -> List[int]:
    arr.sort()
    left = 0
    right = len(arr) - 1
    while left < right:
        if arr[left] + arr[right] == X:
            return [arr[left], arr[right]]
        elif arr[left] + arr[right] < X:
            left += 1
        else:
            right -= 1
    return []
测试样例
arr = [1, 2, 3, 4, 5]
X = 9
print(find_pair(arr, X))  # [4, 5]

arr = [2, 7, 11, 15]
X = 9
print(find_pair(arr, X))  # [2, 7]

arr = [3, 3]
X = 6
print(find_pair(arr, X))  # [3, 3]

arr = [3, 3, 3]
X = 9
print(find_pair(arr, X))  # [3, 3]

arr = [1, 2, 3, 4, 5]
X = 10
print(find_pair(arr, X))  # []