使用数组中的第一个'n'整数递归打印所有子集

时间:2018-03-28 21:27:17

标签: java

递归 使用数组的前n个整数打印可能的子集。 示例:int [] X = [1,2,3,4],如果n = 3,则打印[3,2,23,1,13,12,123]

我已经在这里待了好几个小时,我已经盲目地尝试过,现在我向你们求助了!这是我到目前为止所拥有的。它远不及答案所以请耐心等待。

static void subsets(int[] A, int n){
    subsets("", A, n);
}
private static void subsets(String S, int[] A, int n){
    if(n == 0){
        System.out.println(S);
    } else {
        for (int i = n-1; i >= 0; i--) {
            subsets(A[n-i-1]+S, A, n-i);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

有很多方法可以解决这个子集问题,但我特别喜欢下面的那个。

它依赖于以下事实:当您以二进制计算从二进制(N为2的幂)的1到N时,这些位通过所有可能的唯一组合。因此,如果您将每个位“附加”到数组中的特定值,您将获得值的所有可能组合。

在您的示例中,您在数组中取N = 3个值。使用N位,您可以获得2^3(或1<<3)= 8个不同的值。因此,让我们以二进制从0到7进行计数,并观察每一步开启或关闭的位:

  • 1 = 001 - &gt;仅列出列表中的第一项
  • 2 = 010 - &gt;仅采用列表中的第二项
  • 3 = 011 - &gt; ...
  • 4 = 100
  • 5 = 101 - &gt;采取列表中的第一个和第三个元素
  • 6 = 110
  • 7 = 111

你就是:你在N个元素中找到了所有可能的子集。

以下是代码:

int[] nums = new int[]{1, 2, 3, 4};
int n = 3;

int maxValueOnNBits = 1 << n;

for (int i = 1; i <= maxValueOnNBits; i++) {
    for (int bit = 0; bit < n; bit++) {
        int mask = 1 << bit;
        if ((i & mask) == mask) System.out.print(nums[bit]);
    }
    System.out.println();
}