从大小为n的数组中打印大小为r的所有组合

时间:2014-08-18 13:08:51

标签: java combinations

我想解决以下问题:给定一个大小为n的数组,打印大小为r的所有组合。据我所知,组合意味着顺序无关紧要,即{1, 2}{2, 1}相同,因此我们必须处理重复。我尝试递归地解决问题,但我多次打印相同的组合。这是我的代码:

//main method
public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4};
        int r = 3;
        permute(arr, r);
}

//permute function
private static void permute(int[] arr, int r) {
        int[] res = new int[r];
        doPermute(arr, res, 0, 0, r);
}

//helper function
private static void doPermute(int[] arr, int[] res, int currIndex, int level, int r) {
        if(level == r){
            printArray(res);
            return;
        }
        for (int i = currIndex; i < arr.length; i++) {
            res[level] = arr[currIndex];
            doPermute(arr, res, currIndex+1, level+1, r);
            doPermute(arr, res, currIndex+1, level, r);
        }
    }

//print array function
private static void printArray(int[] res) {
        for (int i = 0; i < res.length; i++) {
            System.out.print(res[i] + " ");
        }
        System.out.println();
}

这是我长期输出的一部分:

1 2 3 
1 2 4 
1 2 3 
1 2 4 
1 3 4 
1 3 4 
1 2 3 
1 2 4 

代码生成所有组合,但重复次数很多。任何帮助都会受到赞赏!

1 个答案:

答案 0 :(得分:0)

对不起我之前的回答,我刚才意识到这太愚蠢了,这就是为什么我为你尝试了一些事情,尝试脱掉循环:

private static void doPermute(int[] arr, int[] res, int currIndex, int level, int r) {
    if(level == r){
        printArray(res);
        return;
    }
    if(currIndex<arr.length){
        res[level] = arr[currIndex];
        doPermute(arr, res, currIndex+1, level+1, r);
        doPermute(arr, res, currIndex+1, level, r);
    }
}