【发布时间】:2016-04-05 14:00:54
【问题描述】:
给定一个包含 n 个数字的数组,我们如何计算该数组在给定范围内的子集(从 0 开始索引),即从第 i 个索引开始到第 j 个索引。我尝试使用位掩码,但由于范围而无法弄清楚如何解决这个问题。
例如,如果数组 a 是 a = [2 6 9 1 7] 并且给定的范围是 1 到 3,那么答案将是 = [6], [9], [1], [6 9] , [6 1], [9 1], [6 9 1]
这是计算数组所有子集的函数,我不确定如何使用该范围约束。
private static void findSubsets(int array[])
{
int numOfSubsets = 1 << array.length;
for(int i = 0; i < numOfSubsets; i++)
{
int pos = array.length - 1;
int bitmask = i;
System.out.print("{");
while(bitmask > 0)
{
if((bitmask & 1) == 1)
System.out.print(array[pos]+",");
bitmask >>= 1;
pos--;
}
System.out.print("}");
}
}
【问题讨论】:
-
为什么不直接创建一个子数组?
-
这不是低效吗? @willywonka_dailyblah
-
或者使用偏移量并适当更改
array.length以将代码限制在数组的该段 -
同样,空集是任何数组的子集的一部分,将 [] 添加到结果中。
-
嘿,还有比位掩码更好的算法吗?我必须反复使用此功能,这对我来说似乎效率低下。
标签: java arrays algorithm subset bitmask