📅  最后修改于: 2023-12-03 15:41:16.780000             🧑  作者: Mango
本 Java 程序旨在找到给定数组中总和为指定值的所有对。例如,如果数组为 [1, 2, 3, 4, 5],总和为 7,则程序将返回以下两个对:(2,5) 和 (3,4)。
本程序基于双指针算法实现,即将左右两个指针分别指向数组的起始和末尾位置,然后在快速移动指针以找到所有满足条件的数对。
下面是本算法的伪代码:
创建一个空的结果列表
将输入数组按升序排序
设定左指针为 0,右指针为数组长度减 1
while 左指针小于右指针:
计算当前左右指针所指元素的和
如果和小于目标总和,则左指针向右移动
如果和大于目标总和,则右指针向左移动
如果和等于目标总和,则将当前元素对加入结果列表
返回结果列表
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class CountPairsWithGivenSum {
static List<Pair> getPairsWithGivenSum(int[] arr, int targetSum) {
List<Pair> result = new ArrayList<>();
Arrays.sort(arr);
int left = 0;
int right = arr.length - 1;
while (left < right) {
int sum = arr[left] + arr[right];
if (sum < targetSum) {
left++;
} else if (sum > targetSum) {
right--;
} else {
result.add(new Pair(arr[left], arr[right]));
left++;
right--;
}
}
return result;
}
static class Pair {
int x, y;
Pair(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public String toString() {
return "(" + x + "," + y + ")";
}
}
}
下面是使用示例:
public class Main {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
int targetSum = 7;
List<CountPairsWithGivenSum.Pair> result = CountPairsWithGivenSum.getPairsWithGivenSum(arr, targetSum);
System.out.println(result);
}
}
输出:
[(2,5), (3,4)]
本算法的时间复杂度为 O(nlogn),其中 n 为输入数组的长度。这是因为需要先将输入数组排序,然后在使用双指针扫描整个数组。空间复杂度为 O(1),因为只使用了常量级别的空间。
本 Java 程序使用双指针算法查找指定输入数组中满足给定总和的不同数对。本算法的时间复杂度为 O(nlogn),空间复杂度为 O(1)。