本文参考自《剑指offer》一书,代码采用Java语言。

更多:《剑指Offer》Java实现合集  

题目

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

思路

  从头开始遍历数字,确定一个数字后,对后面的数字遍历,判断和是否为s,这种方法复杂度为O(n^2),效率太低。

  我们考虑到,如果一个数字比较小,那么另一个数字一定比较大,同时数字为递增排列;所以,我们设置两个指针,一个指针small从第一个数字(最小)出发,另一个指针big从最后一个数字(最大)出发:

  当small加big的和小于s时,只需要将small指向后一个数字(更大),继续判断;

  当small加big的和大于s时,只需要将big指向前一个数字(更小),继续判断;

  当small加big的和等于s时,求解完成。

  由于是从两边往中间移动,所以不会有跳过的情况,时间复杂度为O(n)

测试算例 

  1.功能测试(存在/不存在和为s的一对数字)

  2.特殊输入测试(null)

Java代码

//题目:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们
//的和正好是s。如果有多对数字的和等于s,输出任意一对即可。 public class TwoNumbersWithSum {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> list = new ArrayList<Integer>();
if(array==null || array.length<=0)
return list;
int low=0;
int high=array.length-1;
while(low<high){
if(array[low]+array[high]==sum){
list.add(array[low]);
list.add(array[high]);
break;
}else if(array[low]+array[high]<sum)
low++;
else
high--;
}
return list;
}
}

  

收获

  1.利用两个指针从两端向中间扫描,要学会这种技巧。

  

更多:《剑指Offer》Java实现合集  

最新文章

  1. 【Paddy】数据库监控系列(一) - 监控理念
  2. js数组去重的4种方法
  3. github 添加项目
  4. APACHE POI教程 --java应用程序用POI与Excel交互
  5. OC9_文件操作
  6. Java基础知识强化之IO流笔记06:有return的情况下try catch finally的执行顺序
  7. [置顶] ZK高级特性:Style定制与客户端集成
  8. C++创建对象的三种方式
  9. cocos2dX 事件之触摸事件和触摸事件集合
  10. 创建对象的N种模式
  11. [C#]使用Redis来存储键值对(Key-Value Pair)
  12. PPT分享 | 以太坊钱包分析与介绍
  13. 【一天一道LeetCode】#98. Validate Binary Search Tree
  14. [java,2018-06-26] 扑克牌抽牌求和问题
  15. jsp页面执行java语法,获取的值在页面调用
  16. 【BZOJ1053】 反素数ant
  17. 解决启动mongod 时,出现addr already in use错误
  18. poj 1849 Two 树形dp
  19. SDL结合QWidget的简单使用说明
  20. 在一台server上部署多个Tomcat

热门文章

  1. 20155205 2016-2017-2 《Java程序设计》第5周学习总结
  2. DPM 目标检测1
  3. Linux - iptable 限制 IP 访问端口
  4. JavaScript之事件绑定多个序列执行方法
  5. The folder can’t be opened because you don’t have permission to see its contents.
  6. 一个极好的JavaScript学习网址
  7. python 多线程中子线程和主线程相互通信
  8. B. Planning The Expedition
  9. python - class类 (五) 继承补充-子类继承父类属性/函数方法
  10. CNN可解释