剑指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; }
相关文章推荐
- 剑指Offer学习总结-旋转数组的最小数字
- 剑指Offer学习总结-树中两个结点的最低公共祖先
- 剑指Offer学习总结-用两个栈实现队列
- 剑指Offer学习总结-圆圈中最后剩下的数字
- 剑指Offer学习总结-合并两个排序的链表
- 剑指Offer学习总结-数字在排序数组中出现的次数
- 剑指Offer学习总结-用两个队列实现栈
- 【剑指Offer学习】【面试题41:和为s 的两个数字vs 和为s 的连续正数序列】
- 剑指Offer学习总结-数组中出现次数超过一半的数字
- 剑指Offer学习总结-二维数组寻找数字
- 剑指Offer学习总结-两个链表的第一个公共节点
- [剑指offer][面试题41]和为s的两个数字 VS 和为s的连续正数序列
- 剑指Offer学习总结-不能被继承的类
- 剑指offer 41题【知识迁移能力】和为S的两个数字
- 剑指offer--(8)和为S的两个数字--Java描述
- 剑指offer-面试题40 : 数组中只出现一次的两个数字
- 【剑指offer】6.3知识迁移能力——面试题41:和为s的两个数字VS和为s的连续正数序列
- 码农小汪剑指Offer之40-和为S的两个数字(有序数组) 左右夹逼
- 剑指Offer:和为s的两个数字VS和为s的连续正数序列
- 【剑指Offer学习】【面试题37:两个链表的第一个公共结点】