每天学习一算法系列(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;
}
输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是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;
}
相关文章推荐
- 每天学习一点编程(6)(输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字)
- 14.输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。 要求时间复杂度是O(n)
- 【java 面试100】14.输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字
- 微软面试100题之14题:输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。
- 数据结构——算法之(005)(输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字)
- 14.输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。
- 输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。
- 第14 题: 题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。
- 输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字
- 【练习】输入一个已经按升序排序过的数组和一个数字sum,在数组中查找两个数,使得它们 的和正好是输入的那个数字sum,要求时间复杂度为O(n)
- 输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。
- 输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。
- 题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。
- 题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。
- 题目:输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。 要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。 例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,
- 【编程题目】输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。
- 微软面试14题 输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。
- 输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。
- 输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字
- 输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。