1. 程式人生 > >陣列:如何求陣列中兩兩相加等於20的組合種數

陣列:如何求陣列中兩兩相加等於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);
	}

結果: