📜  门| GATE-CS-2014-(Set-3) |第 48 题(1)

📅  最后修改于: 2023-12-03 14:58:29.436000             🧑  作者: Mango

题目描述

给定一个由n个正整数组成的数组A,和一个整数k,设计算法查找是否存在A中两数之差等于k。

函数签名
def has_pair_diff_k(array: List[int], k: int) -> bool:
    pass
输入

函数将会接受长度为n的一个正整数数组array和一个目标整数k。

输出

如果存在A中存在两个数的差是k,则返回True,否则返回False。

例子
assert has_pair_diff_k([1, 3, 5, 7], 2) == True
assert has_pair_diff_k([1, 3, 5, 7], 3) == True
assert has_pair_diff_k([2, 4, 6, 8], 2) == True
assert has_pair_diff_k([1, 3, 5, 7], 4) == False
assert has_pair_diff_k([1, 5, 3, 4, 2], -1) == True
assert has_pair_diff_k([1, 5, 3, 4, 2], 0) == False
解题思路

针对这道问题,我们可以有以下两种方法:

1. 哈希表

这是最常见的解决方法之一。我们可以先遍历整个数组,然后把所有数加入到一个哈希表中。接着遍历哈希表,判断是否存在target + key或target - key。

def has_pair_diff_k(array: List[int], k: int) -> bool:
    # 创建一个哈希表
    hash_table = {}

    for num in array:
        hash_table[num] = 1

    for num in array:
        if hash_table.get(num + k, 0) or hash_table.get(num - k, 0):
            return True

    return False

时间复杂度是O(n),但是需要额外的空间来保存哈希表。

2. 排序

这是另一种常见的解决方法。我们可以先将数组排序,然后使用two-pointer技术来查找是否存在target + key或target - key。

def has_pair_diff_k(array: List[int], k: int) -> bool:
    # 先对数组排序
    array.sort()

    i, j = 0, 1

    while i < len(array) and j < len(array):
        if i != j and array[j] - array[i] == k:
            return True
        elif array[j] - array[i] < k:
            j += 1
        else:
            i += 1

    return False

时间复杂度是O(nlogn),但是不需要额外的空间。