📜  门| GATE CS 2020 |问题17(1)

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

门| GATE CS 2020 |问题17

本篇题解将向程序员介绍GATE CS 2020的问题17,主要包括问题描述、解决方法和代码实现,并提供相关参考链接供进一步学习与探究。

问题描述

问题17的描述如下:

给定正整数n>2,一个数组a包含n个不同的正整数,一个整数k(1<k<n)。设计一个有效的算法,找到a中两个元素之和等于k的方案数。

解决方法

问题17的解决方法如下:

  • 方法一:暴力枚举。

针对每一个数a[i],都在数组中查找是否存在k-a[i],若存在,则方案数加1。时间复杂度为O(n^2)。

  • 方法二:哈希表。

先将数组a中所有元素存入哈希表中,然后遍历数组a,对于每一个数a[i],在哈希表中查找是否存在k-a[i],若存在,则方案数加1。时间复杂度为O(n)。

  • 方法三:双指针。

将数组a排序,然后设置两个指针i和j分别指向数组的开头和结尾,若a[i]+a[j]==k,则方案数加1;若a[i]+a[j]<k,则将i向右移动一位;若a[i]+a[j]>k,则将j向左移动一位。时间复杂度为O(nlogn)。

代码实现

下面给出三种方法的代码实现:

  • 方法一:暴力枚举。
def solution1(a, k):
    n = len(a)
    cnt = 0
    for i in range(n):
        for j in range(i+1, n):
            if a[i] + a[j] == k:
                cnt += 1
    return cnt
  • 方法二:哈希表。
def solution2(a, k):
    n = len(a)
    cnt = 0
    hash_table = {}
    for i in range(n):
        hash_table[a[i]] = True
    for i in range(n):
        if k-a[i] in hash_table and k-a[i] != a[i]:
            cnt += 1
    return cnt//2
  • 方法三:双指针。
def solution3(a, k):
    n = len(a)
    cnt, i, j = 0, 0, n-1
    a.sort()
    while i < j:
        if a[i] + a[j] == k:
            cnt += 1
            i += 1
            j -= 1
        elif a[i] + a[j] < k:
            i += 1
        else:
            j -= 1
    return cnt
参考链接