查找是否存在两数之和等于某数

题目:给定一个升序整型数组, 在其中找到两个数之和等于某个给定的值,就输出这两个数的下标,否则输出“查找无果”

下面是三中时间复杂度的代码,可以参考一下

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;
		
	}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值