面试题39:求和为指定值的两个数

题目:给定一个递增数组和一个数字S,在数组中找到两个数使得它们之和正好是S。

思路:设置两个游标分别指向数组的首尾元素,判断他们之和与指定值的大小,适当调整游标位置,直到满足要求为止

代码如下:

#include "stdafx.h"
#include <iostream>
using namespace std;
//递增数组nArr的长度为nLength,指定和为sum
//从数组中找到两个数存放在nNum1和nNum2中,它们之和等于sum
bool FindNumbersWithSum(int nArr[], int nLength, int sum, int &nNum1, int &nNum2)
{
   if (nArr == NULL || nLength < 2)
   {
	   return false;
   }

   int nLow = 0;
   int nHigh = nLength - 1;

   while (nLow < nHigh)
   {
       if (nArr[nLow] + nArr[nHigh] > sum)
       {
		   nHigh--;
       }
	   else if (nArr[nLow] + nArr[nHigh] < sum)
	   {
		   nLow++;
	   }
	   else
	   {
            nNum1 = nArr[nLow];
			nNum2 = nArr[nHigh];
			return true;
	   }
   }

   return false;
}


int _tmain(int argc, _TCHAR* argv[])
{
	int nArr[6] = {1,2,4,7,11,15};
	int nNum1 = 0;
	int nNum2 = 0;
	if (FindNumbersWithSum(nArr, 6, 15, nNum1, nNum2))
	{
		cout << "两个数分别为:" << nNum1 << " " << nNum2 << endl;
	}
	else
	{
		cout << "不存在这样的两个数!" << endl;
	}
	system("pause");
	return 0;
}


运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值