class Solution {
public List<List<Integer>> subsets(int[] nums) {
List result=new ArrayList();
dfs(result,new ArrayList(),nums);
return result;
}
public void dfs(List result,List tempList,int[] nums)
{
result.add(new ArrayList(tempList));
for(int i=0;i<nums.length;i++)
{
if(tempList.contains(nums[i]))
{
continue;
}
tempList.add(nums[i]);
dfs(result,tempList,nums);
tempList.remove(tempList.size()-1);
}
}
}
如果这样写代码,[1,2,3]和[3,2,1]其实只算一个子集,但是你算了两遍
所以需要控制后面加进来的数必须索引比前面的数索引大,所以需要增加一个参数index来进行控制
如果你想dfs中传递尽量少的参数,可以将result和tempList设置为全局变量
class Solution
{
List result=new ArrayList();
List tempList=new ArrayList();
public static List<List<Integer>> subsets(int[] nums) {
//n个不同的元素,所以子集总共有2的n次方个
dfs(nums,0);
return result;
}
public static void dfs(int[] nums,int index)
{
//不需要满了才收集,加了一个元素就可以收集
result.add(new ArrayList(tempList));
for(int i=index;i<nums.length;i++)
{
tempList.add(nums[i]);
dfs(result,tempList,nums,i+1);//注意这里是i+1不是index+1
tempList.remove(tempList.size()-1);
}
}
}