【一题两解】高效寻找排序数组中找和的因子

已知有一个已经排序的数组,找和的因子。

思路有三种:

  1. 确定一个,然后依次往后找,类似于冒泡的思想,但是时间复杂度较高(O(n²))
  2. 二分查找的思想。例如找和为10的数字,找每一个数字的差值,然后二分查找该差值是否存在。
  3. 两个索引的思想,因为已经排序,左右两指针、

二分法的代码

static void f(int[] arr) {
		for(int i = 0; i < arr.length; i++){
			int key = 10 - arr[i];
			if(bingSearch(arr, i+1, arr.length-1, key) != -1){
				System.out.print("("+arr[i]+",");
				System.out.print(bingSearch(arr, i+1, arr.length, key)+") ");
			}
		}
	}
	
	static int bingSearch(int[] arr, int low, int high,int key) {
		int mid = low + ((high-low)>>2);
		int midVal = arr[mid];
		if( low <= high ){
			if(midVal < key){
				return bingSearch(arr, mid + 1, high, key);
			} else if (midVal > key) {
				return bingSearch(arr, low, mid - 1, key);
			} else {
				return arr[mid];
			}
		} else{
			return -1;
		}
		
	}
	

两个索引的思想代码

static void f2(int[] arr, int p, int r) {
	int left = p;
	int right = r;
	while(left < right){
		if(arr[left] + arr[right] < 10){
		left++;
		} else if (arr[left] + arr[right] > 10) {
			right--;
		} else {
			System.out.print("("+arr[left]+","+arr[right]+") ");
			left++;
			right--;
		}
	}
}
发布了81 篇原创文章 · 获赞 13 · 访问量 2384

猜你喜欢

转载自blog.csdn.net/alovelypeach/article/details/104225828
今日推荐