给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
思路:
1.递归 每次决定是否要当前位置
public static List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
ArrayList<Integer> list = new ArrayList<>();
if (nums.length == 0 || nums == null) {
return res;
}
getAll(nums,0,list,res);
return res;
}
private static void getAll(int[] nums, int i, ArrayList<Integer> list, List<List<Integer>> res) {
if (i==nums.length) {
res.add(new ArrayList<>(list));
return;
}
list.add(nums[i]);
getAll(nums, i+1, list, res); //要当前
list.remove(list.size()-1);
getAll(nums, i+1, list, res); //不要当前
}
2.回溯递归 对每个位置
public static List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
ArrayList<Integer> list = new ArrayList<>();
if (nums.length == 0 || nums == null) {
return res;
}
//Arrays.sort(nums); // 排序
dfs(nums, 0, list, res); // 递归调用
res.add(new ArrayList<>());// 最后加进来空集
return res;
}
// [1, 2, 3]
private static void dfs(int[] nums, int start, List<Integer> list, List<List<Integer>> res) {
for (int i = start; i < nums.length; i++) {
list.add(nums[i]);
// item是以整数为元素的动态数组,而res是以数组为元素的数组,
// 在这一步,当item增加完元素后,item所有元素构成一个完整的子串,再由res纳入
res.add(new ArrayList<>(list));
dfs(nums, i + 1, list, res);
list.remove(list.size() - 1);
}
}