Given a set of distinct integers, nums, return all possible subsets.
Note: The solution set must not contain duplicate subsets.
For example,
If nums = [1,2,3]
, a solution is:
[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
先对集合进行排序。
第一种方法:分期摊还方法,初始化时,结果集合含有一个空集。
当扫描数列时,保留原有集合,同时将当前扫描的元素插入现有的所有集合中,
从而形成新的集合
public class Solution {
public List<List<Integer>> subsets(int[] nums) {
//对数列进行排序
Arrays.sort(nums);
//创建结果集
List<List<Integer>> resSet = new ArrayList<List<Integer>>();
//初始化加入空集
resSet.add(new ArrayList<Integer>());
for (int i = 0; i < nums.length; i++) {
List<List<Integer>> temRes = new ArrayList<List<Integer>>();
for (List<Integer> list : resSet) {
temRes.add(list);//保留原有结果
List<Integer> clone = new ArrayList<Integer>(list);
clone.add(nums[i]);//在原有结果里加入新元素
temRes.add(clone);
}
resSet = temRes;
}
return resSet;
}
}
第二种方法:就是使用递归的方法,采用回溯法,程序的结构是典型的for语句内调用递归函数。
public class Solution {
public List<List<Integer>> subsets(int[] nums) {
//对数列进行排序
Arrays.sort(nums);
//创建结果集
List<List<Integer>> resSet = new ArrayList<List<Integer>>();
helper(nums, 0, new ArrayList<Integer>(), resSet);
return resSet;
}
public void helper(int[] nums,int start,
List<Integer> subset,List<List<Integer>> resSet) {
if (start > nums.length) {
return;
}
//保留中间任意结果
List<Integer> clone = new ArrayList<Integer>(subset);
resSet.add(clone);
for (int i = start; i < nums.length; i++) {
subset.add(nums[i]);//加入新元素并递归调用下一个元素
helper(nums, i+1, subset, resSet);
subset.remove(subset.size()-1);//回退
}
}
}