题目:输入一个已经按升序排序过的数组和一个数字,
在数组中查找两个数,使得它们的和正好是输入的那个数字。
要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。
分析:
通过设置数组首尾指针,i = 0, j = len -1,
因为数组是有序的,当array[i] + array[j] 大于给定的数字value时,j -- ,
如果小于, i++
如果相等,就恭喜你,找到了。
例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。
实现如下:
#include<iostream> using namespace std; void findTwoValue(int* data, const int len, const int value, int &i, int &j) { int ii = 0; int jj = len - 1; while(jj > ii) { if(data[jj] + data[ii] == value) { i = ii; j = jj; break; } else if( data[jj] + data[ii] > value) { jj --; } else ii ++; } } int main() { int array[6] = {1,2,4,7,11,15}; int v1 = -1, v2 = -1; findTwoValue(array, 6, 15, v1, v2); if(v1 == -1) cout << "cann‘t find array‘s two value add = 15 " <<endl; else cout << "输入数组1、2、4、7、11、15和数字15, 两个数为:" << array[v1] << "," << array[v2] << endl; return 0; }
输出结果为:输入数组1、2、4、7、11、15和数字15, 两个数为:4,11
12. 微软面试题:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字,布布扣,bubuko.com
12. 微软面试题:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字
原文:http://blog.csdn.net/hhh3h/article/details/20833131