常见算法之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++;
        }

 

posted @ 2013-08-07 15:48  欧麦高德  阅读(230)  评论(0编辑  收藏  举报