微软算法面试(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

posted @ 2021-01-29 22:58  天涯学馆  阅读(238)  评论(0编辑  收藏  举报