递归 使用数组的前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);
}
}
}
答案 0 :(得分:1)
有很多方法可以解决这个子集问题,但我特别喜欢下面的那个。
它依赖于以下事实:当您以二进制计算从二进制(N为2的幂)的1到N时,这些位通过所有可能的唯一组合。因此,如果您将每个位“附加”到数组中的特定值,您将获得值的所有可能组合。
在您的示例中,您在数组中取N = 3个值。使用N位,您可以获得2^3
(或1<<3
)= 8个不同的值。因此,让我们以二进制从0到7进行计数,并观察每一步开启或关闭的位:
你就是:你在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();
}