ldjhust

工欲善其事 必先利其器

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

题目:输入一个已经按升序排序过的数组和一个数字,
在数组中查找两个数,使得它们的和正好是输入的那个数字。
要求时间复杂度是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 }

  下面给出一些测试结果:

posted on 2013-05-01 14:52  ldjhust  阅读(297)  评论(1编辑  收藏  举报