📅  最后修改于: 2023-12-03 15:42:12.504000             🧑  作者: Mango
本篇题解将向程序员介绍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