题目:输入一个已经按升序排序过的数组和一个数字,
在数组中查找两个数,使得它们的和正好是输入的那个数字。
要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。
例如输入数组1、2、4、7、11、15
和数字15。由于4+11=15,因此输出4 和11。
思路:因为数组是升序排列的(即使没有排序,我们也可以先排下序),所以很简单,设置两个循环变量,左边循环指向数组第一个数的下标,右边循环变量指向数组最后一个数的下标,然后两个数求和与指定的数比较大小,若等于则找到了一组数,推出循环;若大于,则将右边的循环标量往左移一位,继续比较;若小与,则将左边循环变量往右移一位,继续比较,若一直到左边循环变量的值大于右边循环变量的值,则说明此数组中没有哪两个数是符合要求的。
基于以上分析,代码如下:
1 void FindPairNumber(int *arr, int N, int nValue) 2 { 3 assert (arr != NULL); 4 5 assert (N > 0); 6 7 int i = 0; 8 int j = N - 1; 9 10 while (i <= j) 11 { 12 int nTemp = arr[i] + arr[j]; 13 14 if (nValue == nTemp) 15 { 16 break; 17 } 18 else if (nValue > nTemp) 19 { 20 ++i; 21 } 22 else 23 { 24 --j; 25 } 26 } 27 28 if (i > j) 29 { 30 cout << "没有哪两个数的和等于 " << nValue << endl; 31 } 32 else 33 { 34 cout << arr[i] << " 和 " << arr[j] << " 的和等于 " << nValue << endl; 35 } 36 }
下面给出一些测试结果: