<再来一题>数组中是否存在两数之和等于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)
代码:
下面介绍一种时间复杂度为O(n)的方法:
首先,我们建立一个哈希表,这里选用python的字典,其键是给定数组中第i个数与target的差值(i=0,1,2,3,…,n-1),键值为i,即第i个数的下标。依次遍历数组,直到数组中的某一个数在字典的键中出现,返回该键值和当前下标,否则返回-1,表示没有解。下面为代码:
由2个数之和扩展的问题有 3数之和 以及 3数之和最接近target的值
3数之和解法是先遍历数组的每一个数ai,用target值减去ai,得到新的t=target-ai,再求数组ai+1,ai+2,…,an与t的两数之和的解
给定一个数组: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的两数之和的解
相关文章推荐
- 给定排好序的数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X
- 判断数组中是否存在两数之和等于X
- 给定排好序的数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X
- 给定数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X
- 判断有序整型数组中是否存在两数,相加之和等于给定的任意整数
- 判断数组中是否存在两数之和为给定值
- 迅速找出数组a中是否存在相加后等于整数x的两个元素
- SQL中 不等于<>时存在null的问题
- 判断数组中是否存在和等于给定值的两个数
- 给定一个数组和一个数字,给定的数组里是否存在两个数字之和等于给定的数字
- 给定一个数组,从中查找是否存在两个数的和等于一个给定的x
- 【41】递增数组判断是否存在两个树等于给定值
- 判断NSString是否等于<null>
- MVC 无法将类型“System.Collections.Generic.List<AnonymousType#1>”隐式转换为“System.Collections.Generic.IList<Mvc3Modeltest.Models.Movie>”。存在一个显式转换(是否缺少强制转换?))
- C/C++中判断某一文件或目录是否存在&lt;转&gt;
- linux脚本中判断命令是否存在 hash <the_command>
- 检测远程URL是否存在的三种方法<转>
- 面试题:检查一个数组里是否存在m个数的和等于某个值
- list<Model>判断用户是否存在,取出model只修改指定值
- 有序整型数组A,判断A中是否存在两个数之和等于X,时间O(n)