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