网站策划网/现在阳性最新情况
剑指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 --;elsebehind ++;}return found;
}