计算给定范围内数组的子集?

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("}");
      }
   }