

题目

解决代码及点评
/*
输入一个已经按升序排序过的数组和一个数字,
在数组中查找两个数,使得它们的和正好是输入的那个数字。
要求时间复杂度是 O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。
*/
#include <iostream>
using namespace std;
// 查找函数,pnArr是有序数组
// nLen是数组长度
// nSum是期望的和
// a,b是查找结果下标,如果返回true,那么a,b有效
// 如果返回false说明没有办法求和,a,b无效
bool Find(int *pnArr, int nLen, int nSum, int &a, int &b)
{
int i = 0;
int j = nLen - 1;
// 从两边逼近,i从数组小的一边,j从数组大的一边,逼近期望和
while (i < j)
{
if (pnArr[i] + pnArr[j] > nSum) // 如果和太大,则减小j,让下次和变小
{
j--;
}
else if (pnArr[i] + pnArr[j] < nSum) // 如果和太小,则增加i,让下次和变大
{
i++;
}
else // 如果和正好等于期望和,那么说明已经找到了
{
a = i;
b = j;
return true;
}
}
return false;
}
// 测试主函数
int main()
{
int nArr[] = {1,3,5,7,9,12,32,45,56,78,90};
int nLen = sizeof(nArr) / sizeof(int);
int i, j;
int nSum;
cout<<"请输入一个数字:";
cin>>nSum;
if (Find(nArr, nLen, nSum, i, j))
{
cout<<nArr[i]<<" + "<<nArr[j]<<" = "<<nSum<<endl;
}
else
{
cout<<"没有两数之和为"<<nSum<<endl;
}
system("pause");
return 0;
}
代码下载及其运行
代码下载地址:http://download.youkuaiyun.com/detail/yincheng01/6704519
解压密码:c.itcast.cn
下载代码并解压后,用VC2013打开interview.sln,并设置对应的启动项目后,点击运行即可,具体步骤如下:
1)设置启动项目:右键点击解决方案,在弹出菜单中选择“设置启动项目”
2)在下拉框中选择相应项目,项目名和博客编号一致
3)点击“本地Windows调试器”运行
程序运行结果