回溯法最终需要有一个结束条件,而求所有子集需要子集个数从0-元素个数
因此,进入条件就限制k(元素个数)
注意回溯中,下面进入下一步的时候,控制指向元素指针的是i,不是now
代码:
package com.leetCode.code;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class leet78 {
public static void main(String[] args) {
int[] nums= {1,2,3};
subsets(nums);
for(int i=0;i<ans.size();i++)
{
List<Integer> l = ans.get(i);
for(int j=0;j<l.size();j++)
{
System.out.print(l.get(j));
}
System.out.println();
}
}
static List<List<Integer>> ans = new LinkedList<List<Integer>>();
public static List<List<Integer>> subsets(int[] nums) {
for(int i=0;i<nums.length+1;i++)
{
backtrace(i,0,new ArrayList<Integer>(),nums);
}
return ans;
}
private static void backtrace(int k, int now, ArrayList<Integer> cur, int[] nums) {
if(k==now)
{
ans.add(new ArrayList<Integer>(cur));
return ;
}
for(int i=now;i<nums.length;i++)
{
cur.add(nums[i]);
backtrace(k,i+1,cur,nums);
cur.remove(cur.size()-1);
}
}
}