常见算法之2---排序数组中和为给定值的两个数字
题目:有一个升序的数组a和一个数字N,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。
示例:数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。
方案一:穷举遍历法,一个个比对查找,但这种方法没有好好利用有序这个条件。时间复杂度为O(n*n)。
方案二:
基本思路:找到两个数,将其和与N进行对比,并不断调整。
实现方法:找到数组的第一个数字和最后一个数字。当两个数字的和大于输入的数字时,把较大的数字往前移动;当两个数字的和小于数字时,把较小的数字往后移动;当相等时,打完收工。当前后两个指标最后相遇时还没有找到,证明不存在解。
本质上:是根据当前和的大小,逐步地以最小的步长去向目标靠拢,除非不存在解,否则一定可以找到。
代码:
int small=0; //初始时,分别指向第一个和最后一个下标。
int big=a.length-1;
while(small != big){
if(a[small]+a[big] == N){
print(a[small]+","+a[big]);
break;
}
if(a[small]+a[big] > N)
big--;
if(a[small]+a[big] < N)
small++;
}