问题描述:给定一个数组{1,7,17,2,6,3,14},这个数组中满足条件的有两对组合——17+3=20和6+14=20。
方法一:暴力法。两轮循环暴力查找。
package com.haobi;
/*
* 如何求数组中两两相加等于50的组合
*/
public class Test5 {
public static void findSum(int[] a, int sum) {
int length = a.length;
for(int i=0;i<length;i++) {
for(int j=i;j<length;j++) {
if(a[i]+a[j] == sum) {
System.out.println(a[i]+" "+a[j]);
}
}
}
}
public static void main(String[] args) {
int[] array = {1,7,17,2,6,3,14};
findSum(array, 20);
}
}
方法二:排序法(对撞指针/双索引)。先对数组进行排序,可采取快排(O(nlogn)),然后对排序后的数组分别从前到后和从后到前遍历。假设从前往后遍历的下标为begin,从后往前遍历的下标为end,需要注意的是,(1)当arr[start]+arr[end]<20时,如果存在两个数的和为20,那么这两个数一定在[start+1,end]之间;(2)当arr[start]+arr[end]>20时,如果存在两个数的和为20,那么这两个数一定在[start,end-1]之间;
package com.haobi;
import java.util.Arrays;
public class Test6 {
public static void findSum(int[] a, int sum) {
//对数组进行排序(双路快排)
Arrays.sort(a);
int length = a.length;
int start = 0;
int end = length-1;
while(end > start) {
if(a[start]+a[end] < sum) {
start++;
}else if(a[start]+a[end] > sum) {
end--;
}else {
System.out.println(a[start]+" "+a[end]);
start++;
end--;
}
}
}
public static void main(String[] args) {
int[] array = {1,7,17,2,6,3,14};
findSum(array, 20);
}
}