题目:求数组中两两相加等于20的组合数
例:一个数组{1,7,17,2,6,3,14},这个数组中满足条件的有两对组合{17,3} {6,14}
解题:
方式1. 蛮力法
/**
* 蛮力法
* 使用两重循环遍历数组来判断两个数的和是否是20,算法复杂度为O(n^2)
*
* @param arr 目标数组
*/
public void findSum1(int[] arr) {
int len = arr.length;
for (int i = 0; i < len; i++) {
for (int j = i; j < len; j++) {
if (arr[i] + arr[j] == 20) {
System.out.println("{" + arr[i] + "," + arr[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)
*
* @param arr 目标数组
*/
private void findSum2(int[] arr) {
Arrays.sort(arr);
int begin = 0, end = arr.length - 1;
while (begin < end) {
if (arr[begin] + arr[end] < 20) {
begin++;
} else if (arr[begin] + arr[end] > 20) {
end--;
} else {
System.out.println("{" + arr[begin] + "," + arr[end] + "}");
begin++;
end--;
}
}
}