Java函数,用于计算无重复的排列

Java函数,用于计算无重复的排列,java,combinations,Java,Combinations,我有一个ArrayList,我想找到给定大小的所有组合,其中没有重复,是否内置了单个函数。例如: ArrayList<Integer> numbers = Array.asList(96, 32, 65, 21); getCombinationsWithoutRepeats(numbers, 2); 我该如何创建此函数,或者是否有内置函数可以创建此函数?这是一个使用回溯的示例解决方案。它将生成大小为K的所有可能排列,并将它们存储在列表字段中 此解决方案不适用于数组中有相同元素的情况

我有一个ArrayList,我想找到给定大小的所有组合,其中没有重复,是否内置了单个函数。例如:

ArrayList<Integer> numbers = Array.asList(96, 32, 65, 21);
getCombinationsWithoutRepeats(numbers, 2);

我该如何创建此函数,或者是否有内置函数可以创建此函数?

这是一个使用回溯的示例解决方案。它将生成大小为K的所有可能排列,并将它们存储在列表字段中


此解决方案不适用于数组中有相同元素的情况,但您可以在排列之前排除它们。

相关:。我们可以假设输入数组中只有唯一元素吗?我通过重复来假设您的意思是在输出中?一个非常明显的解决方案是首先生成大小为n的所有组合。最常见的方法是使用n位数字表示集合,并重复递增。每次,数字的按位表示都会告诉您在当前组合中包含/排除哪些元素,然后排列每个组合。例如,流行的词典解决方案:。组合和排列绝对不是一回事!你的标题是排列,而你的描述是组合。是哪一个?仅供参考:组合意味着顺序无关紧要。
>>> [[96, 32], [96, 65], [96, 21], [32, 65], [32, 21], [65, 21]]
List<List<Integer>> lists = new ArrayList<List<Integer>>();

void permutate(int[] arr, int k) {
    internalPermutate(arr, k, 0, 0);
}

void internalPermutate(int[] arr, int k, int step, int index) {
    if (step == k) {
        List<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < k; i++) {
            list.add(arr[i]);
        }
        lists.add(list);
    }

    for (int i = step + index; i < arr.length; i++) {
        swap(arr, step, i);
        internalPermutate(arr, k, step + 1, i);
        swap(arr, step, i);
    }
}

private void swap(int[] arr, int x, int y) {
    int temp = arr[x];
    arr[x] = arr[y];
    arr[y] = temp;
}

public static void main(String[] args) {
    new SomeClass().permutate(new int[] { 1, 2, 3, 4 }, 2);
    System.out.println(lists);
}