数组:如何求数组中两两相加等于20的组合种数

问题描述:

给定一个数组{ 1,7,17,2,6,3,14 } , 这个数组中满足条件的有两对组合 {17,3} {6,14}

思路:

1.蛮力法  

         使用两重循环遍历数组来判断两个数的和是否是20,算法复杂度为O(n^2)

   代码:

	public void findSum1(int[]a, int sum){
		int len = a.length;
		for(int i=0; i<len; i++){
			for(int j=i; j<len; j++){
				if(a[i] + a[j] == 20){
					System.out.println(a[i] + "," + a[j]);
				}
			}
		}
	}//

2.排序法

      先对数组进行排序,可以选用堆排序或者快速排序,此时算法的时间复杂度为O(nlogn), 然后对排序后的数组分别从前到后和从后到前遍历。假设从前到后的下标为begin,从后到前遍历的下标为end,那么:

当 a[begin] + a[end] < 20 时, 如果存在两个数的和等于20,那么这两个数一定在 [begin+1 , end]之间

当 a[begin] + a[end] >20 时, 如果存在两个数的和等于20, 那么这两个数一定在[begin,  end-1] 之间

这个过程的复杂度为O(n), 所以整个算法的时间复杂度为O(nlogn)

代码:

private void findSum(int[] a, int sum) {
		Arrays.sort(a);
		int begin=0,end=a.length-1;
		while(begin<end){
			if(a[begin] + a[end] <20){
				begin++;
			}else if(a[begin] + a[end] >20) {
				end--;
			}else{
				System.out.println(a[begin]+" "+a[end]);
				begin++;
				end--;
			}
		}
	}//

测试代码:

@Test
	public void test1(){
		int[] a = {1,7,17,2,6,3,14};
		findSum(a,20);
		findSum1(a,20);
	}

结果:

猜你喜欢

转载自blog.csdn.net/weixin_38108266/article/details/81272899