算法积累-求无序数组中两两相加等于20的组合数

64 阅读1分钟

题目:求数组中两两相加等于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--;
        }
    }
}