问题描述:
给定一个数组{ 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);
}