📜  给定总和的 Count 对的Java程序(1)

📅  最后修改于: 2023-12-03 15:41:16.780000             🧑  作者: Mango

给定总和的 Count 对的 Java 程序

本 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)。