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], [] ]
我无法理解没有单一注释的答案背后的逻辑,有人可以提供详细的注释,谢谢你的时间!
答案 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>> result
,ArrayList<Integer> list
,int[] num
和int pos
。事实上,如果你一步一步地遵循这个方法,你就能弄明白。
你看到的是一个递归。该方法在for循环期间调用自身,重用代码。 (请使用笔和纸,并按照示例逐步进行。您将理解它)
第一个result
就是名称所说的,一个包含结果的动态数组(也就是列表)。在操作结束时,此变量应具有与&#34;解决方案&#34;中所述相同的数据。在你的例子中阻止。此方法正在修改此数组。
然后list
是在递归期间由num
数组中存在的值填充的列表。 num
是您的数组S = [1,2,3]
。因此num === S
。
最后,pos
是num
数组的索引,用于选择其元素。在for循环中,您可以看到此索引用于填充list
(请参阅list.add(num[i]);
)。
开始时,第一次调用subsetsHelper
时,num
为0.循环运行三次,从0..2(&lt; S.length)。在每次循环运行期间,使用新值调用subsetsHelper
。例如,在for循环的第一次运行中,使用以下值调用subsetsHelper
:
result
- &gt;与调用方法时相同的result
列表,但使用空列表result.add(new ArrayList<Integer>(list))
更新,因为它在for循环之前执行。list
- &gt;更新为list.add(num[i]);
,来自S的值,其中i = pos(在for循环中执行)num
- &gt;与初始相同的数组(因此S)。你可以看到它在这种方法中没有改变。pos
- &gt;自i + 1
执行以来更新(此时,pos则为1)。然后继续执行这些步骤,直到返回主函数。
只需拿笔和纸一步一步地按照方法主体中的说明进行操作。你最终会搞清楚。