您的位置:首页 > Web前端

剑指Offer学习总结-和为S的两个数字

2018-01-25 11:40 267 查看

剑指Offer学习总结-和为S的两个数字

本系列为剑指Offer学习总结,主要是代码案例的分析和实现:

书籍链接:http://product.dangdang.com/24242724.html

原作者博客:http://zhedahht.blog.163.com/blog/static/254111742011101624433132/

原作者博客链接有完整的项目代码下载。

和为S的两个数字

题目

题目:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。

例如:{1,2,4,7,11,15}找出和为15的两个数字,因为4+11=15,所以最后输出4和11。

最初的解法

暴力解法,直接遍历每个元素,然后对每个元素与后边的元素进行相加看是否等于某个数字。

双指针的解法

设置两个指针,s1指向数组的起始位置,s2指向数组的结束位置,然后将它们指向的值相加,如果大于s,说明大的数字太大,s2向前移动一位再次判断,如果小于s,s1向后移动移动,直到找出和为s的两个数字。

从{1,2,4,7,11,15}找出和为15的两个数字

1.s1指向1,s2指向15,1+15=16>15所以s2向前移

2.1+11<=12<15,s1向后移一位

3.2+11=13<15,s1向后移一位

4.4+11=15=15,结束

bool FindNumbersWithSum(int data[], int length, int sum,
int* num1, int* num2)
{
bool found = false;
if(length < 1 || num1 == NULL || num2 == NULL)
return found;

int ahead = length - 1;//指向后边的数字
int behind = 0;//指向前边的数字

while(ahead > behind)
{
//计算出当前的和
long long curSum = data[ahead] + data[behind];

//判断当前和和所要求和的三种关系情况
//如果等于 保存当前两个数字,跳出循环 返回
//大于 需要向变小的趋势  将大的数字变小  前移
//小于 需要向变大的趋势  将小的数字变大  后移
if(curSum == sum)
{
*num1 = data[behind];
*num2 = data[ahead];
found = true;
break;
}
else if(curSum > sum)
ahead --;
else
behind ++;
}

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