陣列:如何求陣列中兩兩相加等於20的組合種數
阿新 • • 發佈:2018-12-30
問題描述:
給定一個數組{ 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);
}