[英]Recursively Print All Subsets Using First 'n' Integers in an Array
使用数组的前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到N计数(N是2的幂)时,这些位会经过所有可能的唯一组合。 因此,如果将每个位“附加”到数组中的特定值,则将获得值的所有可能组合。
在您的示例中,您在数组中取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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.