寻找和为定值的两个数

来源:互联网 发布:matlab矩阵归一化函数 编辑:程序博客网 时间:2024/05/21 12:45

描述:
输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。

要求时间复杂度是O(N)。如果有多对数字的和等于输入的数字,输出任意一对即可。

例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。

分析:
如果采取穷举,复杂度为O(N^2),可以换一个思路,题目相当于对每个a[i],查找sum-a[i]是否也在原始序列中,每一次要查找的时间都要花费为O(N),假如采用二分查找,时间复杂度可以提高到O(Nlog N)。
如何将时间复杂度降为O(N)呢?
如果数组是无序的,先排序(N log N),然后用两个指针i,j,各自指向数组的首尾两端,令i=0,j=n-1,然后i++,j–,逐次判断a[i]+a[j]是否等于sum。所以,数组无序的时候,时间复杂度最终为O(N log N + N)=O(N log N)。如果原数组是有序的,则不需要事先的排序,直接用两指针分别从头和尾向中间扫描,时间复杂度为O(N),且空间复杂度还是O(1)。
下面是此思路(这里假定数组已经是有序的)的python实现:

def  twoSum(str,n):    head=0    tail=len(str)-1    for i in range(len(str)):        if str[head]+str[tail]==n:            print str[head],str[tail]            break        elif str[head]+str[tail]>n:            tail-=1        else:            head+=1

总结:
要想达到时间O(N),空间O(1)的目标,除非原数组是有序的(指针扫描法),不然,当数组无序的话,就只能先排序,后指针扫描法或二分(时间 O(Nlog N),空间O(1)),或映射或hash(时间O(N),空间O(N))。时间或空间,必须牺牲一个以达到平衡。

0 0
原创粉丝点击