题目:给定一个升序整型数组, 在其中找到两个数之和等于某个给定的值,就输出这两个数的下标,否则输出“查找无果”
下面是三中时间复杂度的代码,可以参考一下
1.时间复杂度为o(n²)
function:直接两个for循环暴力解决问题
/*
* 方法描述:该方法主要用于找到两个数之和等于某数
* @param a:待查询数组 x:待查找的关键值
* @author @Lqx
*/
public static void searchTwoSum(int[] a,int x) {
int sum=0;
for(int i=0;i<a.length;i++) {
for(int j=0;j<a.length;j++) {
sum=a[i]+a[j];
if(sum==x) {
// return new int[] {i,j};
System.out.println("这两个数的下标分别是:"+i+" "+index);
}
}
}
System.out.println("查找无果");
// throw new IllegalArgumentException("can't search two number");
}
}
2.时间复杂度为o(nlog₂n)
function:先取一个数,再作差找到剩下的数,然后用二分查找判断是否存在这样的数(二分查找算法在文章末尾附上,若找到某数则返回该数下标,反之返回-1)
public static void searchTwoSum(int[] a,int x) {
int index=-1;
int j=0;
for(int i=0;i<a.length/2;i++) {
int another=x-a[i]; //另一个数的值
index=BinarySearch.binarySearch(a, another);
if(index!=-1) {
//不等于-1,说明存在这样的数
// return new int[] {i,index};
System.out.println("这两个数的下标分别是:"+i+" "+index);
continue;
}
j=i;
}
if(j==(a.length/2)-1) {
System.out.println("查找无果");
}
// throw new IllegalArgumentException("can't search two number");
}
}
3.时间复杂度为O(n)
function:给定左右两个指针,将两数相加之和与给定值相比较,据此来移动指针
public static void searchTwoSum(int[] a,int x) {
int j=0;
//left:左指针 right:右指针
for(int i=0,left=0, right=a.length-1;i<a.length && left<=right;i++) {
int sum=a[left]+a[right];
if(sum==x) {
System.out.println("这两个数的下标分别是:"+left+" "+right);
left++;
right--; //继续找看有没有多的情况
}else if(sum>x) {
right--;
}else if(sum<x){
left++;
}
j=i;
}
//如果最后整个序列遍历完,都没找到,则输出
if(j==a.length-1) {
System.out.println("查找无果");
}
}
}
附:二分查找算法
/*
* 方法描述:该方法用来查找值为x的元素,找到返回下标,找不到则返回-1
* @param a:待找序列 x:待查找的关键值
*/
public static int binarySearch(int[] a,int x) {
int left=0;
int right=a.length-1;
int index=-1;
while(left<right) {
//相遇就不循环
int mid=(left+right)/2;
System.out.println("mid"+mid);
if(x>a[mid]) {
left=mid+1;
if(x==a[left]) {
index=left; //可能刚好指针指的就是那个数
break;
}
}else if(x<a[mid]){
right=mid-1;
if(x==a[right]) {
index=right; //可能刚好指针指的就是那个数
break;
}
}else{
index=mid;
break;
}
}
return index;
}