您的位置:首页 > 其它

每天学习一算法系列(14) (输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字)

2011-05-09 22:57 671 查看
题目:

输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。

如果有多对数字的和等于输入的数字,输出任意一对即可。

例如:输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。

思路一:

题目要求时间复杂度为O(n),那么就只有一次遍历数组就得找出结果。集体做法是这样:开始从数组最后索引End和开始索引First开始进行遍历,然后比较最后索引的值A[End]是否大于输入的那个数字,如果大于,那么就把End递减,如果小于,就把值A[End]+A[First]的值和输入的值比较,如果小于那么First递增,再进行以上的比较,直到找出正确的值为止。

代码如下:

/*-----------------------------
Copyright by yuucyf. 2011.05.09
------------------------------*/
#include "stdafx.h"
#include <assert.h>
#include <iostream>
using namespace std;

bool OutputProperlyValue(const int *pA, int nSize, int nKey)
{
assert(NULL != pA || nSize > 0);

int i32First = 0, i32End = nSize - 1;
for (; i32First < i32End; )
{
if (pA[i32End] >= nKey)
{
i32End--;
}
else if ((pA[i32End] + pA[i32First]) < nKey)
{
i32First++;
}
else if ((pA[i32End] + pA[i32First]) > nKey)
{
i32End--;
}
else
{
cout << "两个元素和为" << nKey << "的值的数组元素为:" << pA[i32First] << "和" << pA[i32End] << endl;
break;
}
}

if (i32First >= i32End)
return false;
return true;
}

int _tmain(int argc, _TCHAR* argv[])
{
int aryT[] = {1, 2, 4, 7, 11, 15};
if (!OutputProperlyValue(aryT, (sizeof(aryT)/sizeof (int)), 14))
{
cout << "数组里没有合适的值" << endl;
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐