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

问题描述:
给定一个数组: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的两数之和的解

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值