今天写的一个版本:
1、有序数组,先写一个二分查找的方法
private static int[] erfen(int[] a,int left,int right,int num) {
//left:数组a的左边界
//right:数组a的右边界
//num:目标数
//返回int[0]是是否找到了该数,1为找到了,0为未找到;int[1]是如果找到了则返回改数的序号,如果未找到则返回离改数最近的比改数小的数的序号
int[] res=new int[2];
int mid = (right+left)/2;
if(num==a[mid])
res[0]=1;
while(mid<right&&mid>left&&num!=a[mid]){
if(num>a[mid])
left=mid;
else if(num<a[mid])
right=mid;
mid = (right+left)/2;
if(num==a[mid])
res[0]=1;
}
res[1]=mid;
return res;
}
2、调用以上方法
public static int[] twoSum(int[] nums, int target) {
int[] res=new int[2];
if(nums.length>1){
int[] erfen = new int[2];
erfen = erfen(nums,0,nums.length,target);//先使用一次二分查找,确定查找的右边界
int right = erfen[1];
for(int i = 0 ; i <=right ; i++){
int second = target-nums[i];
int[] erfen1 = new int[2];
erfen1 = erfen(nums,i,right+1,second);
if(erfen1[0]==0){
right=erfen1[1];//更新右边界
}
else{
res[0]=i+1;
res[1]=erfen1[1]+1;
break;
}
}
}
return res;
}
3、写一个测试的主方法
public static void main(String[] args) {
int[] a = new int[]{2,7,11,15,16};
int target = 26;
int[] b = new int[2];
b=twoSum(a,target);
for(int i:b){
System.out.println(i);
}
}
有待继续优化。。。。。。