输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和是输入的那个数字,要求时间复杂度为O(n),如果有多对数字的和等于输入的数字,输出任意一对即可。
private static void findAns(int[] data, int sum) {
int size = data.length;
int begin = 0;
int end = size-1;
while (begin < size && end >=0 && begin < end) {
int cu = data[begin] + data[end];
if (cu > sum) {
end --;
} else if (cu < sum) {
begin ++;
} else {
System.out.println(data[begin] + " " + data[end]);
return;
}
}
System.out.println("无匹配项");
}
publicvoidfind(int[] a,inttarget){
intsmall=0;
intbig=a.length-1;
while(small<big){
if(a[small]+a[big]>target){
big--;
}
if(a[small]+a[big]<target){
small++;
}
if(a[small]+a[big]==target){
System.out.println(a[small]+" "+a[big]);
break;
}
}
}
因为是升序排列
两个标志位,最小值small,和最大值big.
如果最小值的位置加最大值的位置和大于目标值,说明big值太大了,所以--
如果最小值位置加最大值位置小于目标值,说明small值太小
所以++
直到找到或没找到
public static void main(String[] args){ int[] a={1,2,3,4,5,6}; int b = 9; findSum(a,b); } public static void findSum(int[] data,int sum){ int size = data.length; int end = size-1; int begin = 0; while (begin<size && end>=0 && begin<end){ int cu =data[begin] + data[end]; if (cu<sum){ begin++; }else if(cu>sum){ end--; }else{ System.out.println(data[begin]+" "+data[end]); end--; begin++; } } } }
{ return 0;
}