题目
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
分析
子集是回溯法的另一类经典题目,解决方法还是画出深度优先搜索树,找到路径和可选列表,与全排列不同的点有两个:一是集合是无序的,二是树中每一个结点都应该直接加入答案集。
可以发现,在同一层中,可选列表有特点:元素越来越少,且只含当前 path 中末尾元素之后的元素。如:[1, 2, 3], 当前 path 是 2,那么可选列表只有 3。这样做是为了保证子集不重复。
引入 pos 来保证可选列表上述的特征。
代码
class Solution {
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
if (nums == null || nums.length == 0) return result;
subsetsHelper(result, new ArrayList<>(), nums, 0);
return result;
}
private void subsetsHelper(List<List<Integer>> result, List<Integer> path, int[] nums, int pos) {
result.add(new ArrayList<Integer>(path));
for (int i = pos; i < nums.length; i++) {
path.add(nums[i]);
subsetsHelper(result, path, nums, i + 1);
path.remove(path.size() - 1);
}
}
}
更多的相似题目,见回溯法刷题模板。