给你一个整数数组 nums
,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
这题属于标准的回溯问题(排列问题(组合,全排),基本上就可以用回溯来解决)。
回溯就四步:
1. 确定边界;本题的边界就是当前数组的size与元数组的size一致时就结束,即取到所有元素了。
2. 记录临时数组;当满足条件时,就存储当前数组。本题满足条件是回溯到了最后一个元素,就将临时数组存入到结果数组里面。
3. 取当前元素;将当前元素存入临时数组,然后回溯,一定要记住,回溯之前如果取了元素就要移除去的元素。
4. 不取当前元素;直接回溯;
1 public class SubsetsA {
2 public List<List<Integer>> subsets(int[] nums) {
3 List<List<Integer>> ans = new ArrayList<>();
4 List<Integer> temp = new ArrayList<>();
5 perm(nums, ans, temp, 0);
6 return ans;
7 }
8
9 public void perm(int[] nums, List<List<Integer>> ans, List<Integer> temp, int n) {
10 if (n == nums.length) {
11 ans.add(new ArrayList<>(temp));
12 return;
13 }
14 if(temp.size() == nums.length) {
15 return;
16 }
17 // 取当前元素
18 temp.add(nums[n]);
19 perm(nums, ans, temp, n + 1);
20 temp.remove(temp.size() - 1); // 递归结束后移除添加进的元素
21
22 // 不取当前元素
23 perm(nums, ans, temp, n + 1);
24 }
25
26 public static void main(String[] args) {
27 int[] nums = {1, 2, 3};
28 System.out.println(new SubsetsA().subsets(nums));
29 }
30 }
原文:https://www.cnblogs.com/haifwu/p/14805974.html