输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。
菜鸟的写法是顺序扫描,时间复杂度是O(n2)。下面给出一种大牛的写法,时间复杂度只需O(n)。
1 //////////////////////和为S的两个数字////////////////////////////////// 2 3 bool FindNumbersWithSum(int* data , int length , int sum) 4 { 5 if (data == NULL || length < 2) 6 { 7 return false ; 8 } 9 int begin = 0 ; 10 int end = length - 1 ; 11 while (begin < end) 12 { 13 long long CurSum = data[begin] + data[end]; 14 if (CurSum == sum) 15 { 16 cout<<data[begin]<<"+"<<data[end]<<endl; 17 return true ; 18 } 19 else if (CurSum > sum)//当前和大于 sum ,end指针向后走一位 20 { 21 end--; 22 } 23 else //当前和小于 sum ,begin指针向前走一位 24 { 25 begin++; 26 } 27 } 28 return false ; 29 }