双指针法
输入一个递增序列和一个数字s,输出任意一对数字使得他们的和是s。
最简单的方法是依次遍历中再遍历,为O(n2)
可以发现这个题很显然是排序序列加对子,所以使用双指针法。
先选两个数字(选第一个和最后一个),如果发现和大于s,则将后面那个向前移动,如果发现小于s,则将前面那个向后移动。反正就是穷举。这样遍历一次就可以,O(n)
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> list=new ArrayList<Integer>();
if(array==null || array.length==0){return list;}
int lo=0;
int hi=array.length-1;
int s=0;
while(lo<hi){
s=array[lo]+array[hi];
if(s==sum){
list.add(array[lo]);
list.add(array[hi]);
return list;
}else if(s<sum){
lo++;
}else{
hi--;
}
}
return list;
}
}