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

题目:

输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是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; }

    原文作者:查找算法
    原文地址: https://blog.csdn.net/yuucyf/article/details/6407926
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞