- 子集
给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
示例 1:
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:
输入:nums = [0]
输出:[[],[0]]
class Solution {
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> ans = new ArrayList<List<Integer>>();
dfs(nums,0,ans,new ArrayList<Integer>() );
return ans;
}
public static void dfs(int[] num,int index,List<List<Integer>> ans,List<Integer> tem ){
if(index == num.length){
ans.add(new ArrayList<Integer>(tem));
//ans.add(tem);
return;
}
//不选
dfs(num,index+1,ans,tem);
//选
tem.add(num[index]);
dfs(num,index+1,ans,tem);
tem.remove(tem.size() - 1);
}
}
注意: 用 ans.add(new ArrayList<Integer>(tem));
是正确的输出,但是如果使用ans.add(tem);
的话,就会输出空的。
这是因为如果是直接ans.add(tem);
,ans中指向的是tem的值,由于会进行tem.remove(tem.size() - 1);
,所以在dfs结束之后tem的值为空。所以ans就为空。在示例中,一共会执行ans.add(tem);
八次,所以在ans中又八个tem,由于最终tem的值为空,所以就会输出八个空的。用 ans.add(new ArrayList<Integer>(tem));
的话,就相当于是新建了一个列表的值和当前的tem相等,然后将其添加进入add,此时add中的值便不会受到tem的影响,就有正确的输出。
有个例子:
每次进行一次ans.add(tem),就相当于是把一个tem加入到了ans中,最终的值由最终的tem来决定。