本题的题意是根据输入构造输入能构成的所有的子集。很明显可以用回溯法来解决,一个数字一个数字地遍历,然后从0到最大长度决定子集的长度len,然后进行dfs开始搜索,加入当前元素后再从当前元素的后一个元素开始加入长度为len-1的子集,依次遍历下去即可。
代码如下:
class Solution {
public List<List<Integer>> subsets(int[] nums) {
int len=nums.length;
List<List<Integer>> result= new ArrayList<List<Integer>>();
List<Integer> set=new ArrayList<Integer>();
result.add(set);
for (int i=0;i<len;i++) //起始元素的位置
{
for (int j=1;j<=len;j++) // 要构造的子集的长度
{
List<Integer> set1=new ArrayList<Integer>();
dfs(result,set1,nums,i,j);
}
}
return result;
}
public void dfs(List<List<Integer>> result, List<Integer> now, int []nums, int pos,int len)
{
if (pos+len-1>=nums.length) return;
now.add(nums[pos]);
if (len==1)
{
result.add(now);
return;
}
for (int i=pos+1;i<nums.length;i++)
{
List<Integer> now1=new ArrayList<Integer>(now);
dfs(result,now1,nums,i,len-1);
}
}
}