用于子集的Java算法解决方案

时间:2017-04-04 12:30:02

标签: java algorithm subset

public class Solution {
    public ArrayList<ArrayList<Integer>> subsets(int[] num) {
        ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
        if(num == null || num.length == 0) {
            return result;
        }
        ArrayList<Integer> list = new ArrayList<Integer>();
        Arrays.sort(num);  
        subsetsHelper(result, list, num, 0);

        return result;
    }


    private void subsetsHelper(ArrayList<ArrayList<Integer>> result,
        ArrayList<Integer> list, int[] num, int pos) {//especially,what are these variable represent for

        result.add(new ArrayList<Integer>(list));

        for (int i = pos; i < num.length; i++) {

            list.add(num[i]);
            subsetsHelper(result, list, num, i + 1);
            list.remove(list.size() - 1);
        }
    }
}
  

描述
  给定一组不同的整数,返回所有可能的   子集。

     

通知
  子集中的元素必须按非降序排列。解决方案集   不得包含重复的子集。你有没有遇到这个问题?   真正的面试?是

     

示例
  如果S = [1,2,3],则解决方案是:

[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

我无法理解没有单一注释的答案背后的逻辑,有人可以提供详细的注释,谢谢你的时间!

1 个答案:

答案 0 :(得分:0)

注意:评论框太小了。所以在这里给出答案。只是不要......投票。

  

@KarelG谢谢..这个函数中的变量是什么意思? private void subsetsHelper(ArrayList&gt; result,ArrayList list,int [] num,int pos)

private void ...是方法签名,而不是&#34;注释&#34;。方法签名由各个部分组成。您可以在this link

上阅读有关此主题的更多信息
  

更一般地说,方法声明按顺序有六个组件:

     

1)修饰符 - 例如公开,私人和其他您稍后会了解的内容。

     

2)返回类型 - 方法返回的值的数据类型,如果方法未返回值,则返回void。

     

3)方法名称 - 字段名称的规则也适用于方法名称,但约定略有不同。

     

4)括号中的参数列表 - 以逗号分隔的输入参数列表,前面是数据类型,括在括号中,()。如果没有参数,则必须使用空括号。

     

5)例外列表 - 稍后将讨论。

     

6)括在括号之间的方法体 - 方法的代码,包括局部变量的声明,就在这里。

现在,您已经要求提供&#34;变量&#34; (参数实际上是正确的术语),其中有4个:ArrayList<ArrayList<Integer>> resultArrayList<Integer> listint[] numint pos。事实上,如果你一步一步地遵循这个方法,你就能弄明白。

你看到的是一个递归。该方法在for循环期间调用自身,重用代码。 (请使用笔和纸,并按照示例逐步进行。您将理解它)

第一个result就是名称所说的,一个包含结果的动态数组(也就是列表)。在操作结束时,此变量应具有与&#34;解决方案&#34;中所述相同的数据。在你的例子中阻止。此方法正在修改此数组。

然后list是在递归期间由num数组中存在的值填充的列表。 num是您的数组S = [1,2,3]。因此num === S

最后,posnum数组的索引,用于选择其元素。在for循环中,您可以看到此索引用于填充list(请参阅list.add(num[i]);)。

开始时,第一次调用subsetsHelper时,num为0.循环运行三次,从0..2(&lt; S.length)。在每次循环运行期间,使用新值调用subsetsHelper。例如,在for循环的第一次运行中,使用以下值调用subsetsHelper

  1. result - &gt;与调用方法时相同的result列表,但使用空列表result.add(new ArrayList<Integer>(list))更新,因为它在for循环之前执行。
  2. list - &gt;更新为list.add(num[i]);,来自S的值,其中i = pos(在for循环中执行)
  3. num - &gt;与初始相同的数组(因此S)。你可以看到它在这种方法中没有改变。
  4. pos - &gt;自i + 1执行以来更新(此时,pos则为1)。
  5. 然后继续执行这些步骤,直到返回主函数。

    只需拿笔和纸一步一步地按照方法主体中的说明进行操作。你最终会搞清楚。