面试题57(1):和为s的数字

题目

输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。
例如,输入数组{1,2,4,7,11,15}和数字15.由于4+11=15,因此输出4和11

解题思路

  1. 定义两个指针,第一个指针指向数组的第一个(最小的)数字1,第二个指针指向数组的最后一个(最大的)数字15.
  2. 这两个数字的和16>15,因此把第二个指针往前移动一个数字,让它指向11。这时候两个数字1与11的和为12,小于15.
  3. 把第一个指针往后移动一个数字指向2,2+11<15,继续把第一个指针往后移动。

代码

class Solution{
    public:
        bool findNumwithSum(int *a,int length,int *num1,int *num2,int sum)
        {
            bool found = false;
            if(length < 1 || num1 == NULL || num2 == NULL)
            {
                return found;
            }

            int ahead = length-1;
            int behind = 0;
            while(ahead > behind)
            {
                long long curSum = a[ahead] + a[behind];
                if(curSum == sum)
                {
                    *num1 = a[behind];
                    *num2 = a[ahead];
                    found = true;
                    break;
                }
                else if(curSum > sum)
                {
                    ahead--;
                }
                else
                {
                    behind++;
                }
            }
            return found;
        }
};

完整代码见Github

你可能感兴趣的:(面试题57(1):和为s的数字)