每天一道算法题15

给定一个有序数组arr,给定一个正数aim,
1)返回累加和为aim,所有不同二元组
2)返回累加和为aim,所有不同三元组

解答1: 因为arr是一个有序数组,所以这里可以用双指针,分别指向头尾L,R,如果arr[L]+arr[R] > aim,则R--
如果arr[L]+arr[R] < aim,则L++,如果arr[L]+arr[R]=aim, 如果arr[L] != arr[L-1], 则可以算一个二元组,并且L++;

public static void printUniquePair(int arr[], int aim) {
    if (arr == null || arr.length < 2) {
        return;
    }

    int left = 0; 
    int right = arr.length - 1;
    while(left < right) {
        if (arr[left] + arr[right] > aim) {
            right --;
        } else if (arr[left] + arr[right] < aim) {
            right++
        } else {
            if (left == 0 || arr[left - 1] != arr[left]) {
                System.out.println(arr[left] + " " + arr[right]);
            }
            left++;
            right--;
        }
    }
}

解答2: 这个三元组可以认为每次固定一个值,然后在剩下的范围内找到累加和为aim-arr[i]的不同二元组,这里要注意,如果是重复的,就可以跳过,
因为重复的剩下的范围前面一个已经包含进去了。

public static void printUniqueTriad(int[] arr, int aim) {
    if (arr == null || arr.length < 3) {
        return;
    }

    for (int i = 0; i < arr.length - 2 ; i++) {
        if (i == 0 || arr[i] != arr[i-1]) {
            printRest(arr, i+1, arr.length - 1, aim-arr[i]);
        }
    }
}

public static void printRest(int[] arr, int left, int right, int aim) {
    while(left < right) {
        if (arr[left] + arr[right] > aim) {
            right --;
        } else if (arr[left] + arr[right] < aim) {
            right++
        } else {
            if (arr[left - 1] != arr[left]) {
                System.out.println(arr[left] + " " + arr[right]);
            }
            left++;
            right--;
        }
    }
}

你可能感兴趣的:(每天一道算法题15)