计算给定范围内数组的子集?
Calculating subsets of an array within a given range?
给定一个包含 n 个数字的数组,我们如何在给定范围内(即从第 i 个索引到第 j 个索引)计算该数组的子集(从 0 开始索引)。我尝试使用位掩码,但由于范围的原因无法弄清楚如何解决这个问题。
例如,如果数组 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("}");
}
}
如果您当前的 findSubSets
实现有效,那么转换为范围几乎是微不足道的。只需包含等于 i
的偏移索引并将 array.length
更改为 j - i + 1
.
private static void findSubsets(int array[], int i, int j)
{
int arrayLen = j - i + 1;
int numOfSubsets = 1 << (arrayLen - 1);
for (int k = 1; k < numOfSubsets; k++)
{
int pos = j;
int bitmask = k;
System.out.print("{");
while (bitmask > 0)
{
if ((bitmask & 1) == 1)
System.out.print(array[pos] + ",");
bitmask >>= 1;
pos--;
}
System.out.print("}");
}
}
给定一个包含 n 个数字的数组,我们如何在给定范围内(即从第 i 个索引到第 j 个索引)计算该数组的子集(从 0 开始索引)。我尝试使用位掩码,但由于范围的原因无法弄清楚如何解决这个问题。
例如,如果数组 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("}");
}
}
如果您当前的 findSubSets
实现有效,那么转换为范围几乎是微不足道的。只需包含等于 i
的偏移索引并将 array.length
更改为 j - i + 1
.
private static void findSubsets(int array[], int i, int j)
{
int arrayLen = j - i + 1;
int numOfSubsets = 1 << (arrayLen - 1);
for (int k = 1; k < numOfSubsets; k++)
{
int pos = j;
int bitmask = k;
System.out.print("{");
while (bitmask > 0)
{
if ((bitmask & 1) == 1)
System.out.print(array[pos] + ",");
bitmask >>= 1;
pos--;
}
System.out.print("}");
}
}