您的位置:首页 > 其它

<再来一题>数组中是否存在两数之和等于target

2017-12-31 22:37 337 查看
问题描述:

给定一个数组:a1,a2,…,an,和一个目标数值target,问数组中是否存在两个数ai和aj,使得ai+aj等于target。

解题思路:

先将数组排序,时间复杂度为O(nlogn),然后分别用两个指针 i , j 指向排序后数组的头和尾,计算ai+aj,之和s,若s大于target,则说明j取值过大,所以j=j-1;若s小于target,则说明i取值过小,所以i=i+1。若s等于target,则说明ai,aj是一组解,若只需求解是否存在,或一组解,这时可以返回,否则可同时使i=i+1,j=j-1,直到i>=j才跳出循环。时间复杂度为O(n)。总的时间复杂度为O(nlogn)

代码:

def two_sum(a,target):
head=0
tail=len(a)-1
a.sort()
solution=[]
while head<tail:
if a[head]+a[tail]>target:
tail-=1
elif a[head]+a[tail]<target:
head+=1
elif a[head]+a[tail]==target:
head+=1
tail-=1
solution.appned((a[head],a[tail]))
return solution


下面介绍一种时间复杂度为O(n)的方法:

首先,我们建立一个哈希表,这里选用python的字典,其键是给定数组中第i个数与target的差值(i=0,1,2,3,…,n-1),键值为i,即第i个数的下标。依次遍历数组,直到数组中的某一个数在字典的键中出现,返回该键值和当前下标,否则返回-1,表示没有解。下面为代码:

def two_sum(a,target):
d={}
for index,num in enumerate(a):
if num in d:
return [d[num],index]
else:
d[target-num]=index
return -1


由2个数之和扩展的问题有 3数之和 以及 3数之和最接近target的值

3数之和解法是先遍历数组的每一个数ai,用target值减去ai,得到新的t=target-ai,再求数组ai+1,ai+2,…,an与t的两数之和的解
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐