每天一道算法题15
2022-01-24 本文已影响0人
雨打空城
给定一个有序数组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--;
}
}
}