1. question: 子集(中等)
给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/subsets
示例 1:
1 2
| 输入:nums = [1,2,3] 输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
|
示例 2:
1 2
| 输入:nums = [0] 输出:[[],[0]]
|
提示:
1 2 3
| 1 <= nums.length <= 10 -10 <= nums[i] <= 10 nums 中的所有元素 互不相同
|
2. answers
因为做了好几道回溯的问题了,所以这道题首先想到的是回溯法。这道题和组合类似,只不过即没有限制集合的元素个数、也没有限制元素之和。也就是说,递归条件没有了?那么该如何终止递归呢?首先想到的是,因为子集的个数是有限的,可以将子集的个数分为[0, n],分别构建长度为0、1、2。。。n的子集,最终组合。代码如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| public class Solution_0085 {
List<List<Integer>> result = new ArrayList<>();
LinkedList<Integer> group = new LinkedList<>();
public void getSet(int[] nums, int startIndex, int target) {
if(group.size() == target) { result.add(new ArrayList<>(group)); return; }
for (int i = startIndex; i < nums.length; i++) {
group.add(nums[i]);
getSet(nums, i + 1, target);
group.removeLast();
} }
public List<List<Integer>> subsets(int[] nums) {
for (int i = 1; i <= nums.length; i++) {
getSet(nums, 0, i); }
result.add(new ArrayList<>());
return result; }
public static void main(String[] args) {
int[] nums = {0};
Solution_0085 s = new Solution_0085();
List<List<Integer>> result = s.subsets(nums);
for(List<Integer> inte: result) {
for(Integer i: inte) System.out.print(i + "\t");
System.out.println(); } } }
|
但是,实际上,每次递归,都会从下一个下标开始求解子集,此时肯定会跳出循环,即终止递归的。所以上述的条件递归条件可以不用写。
另外,只要找到一个元素,就将其添加到结果中即可。代码如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| public class Solution_0085_02 {
List<List<Integer>> result = new ArrayList<>();
LinkedList<Integer> group = new LinkedList<>();
public void getSet(int[] nums, int startIndex) {
for (int i = startIndex; i < nums.length; i++) {
group.add(nums[i]); result.add(new ArrayList<>(group));
getSet(nums, i + 1);
group.removeLast();
} }
public List<List<Integer>> subsets(int[] nums) {
getSet(nums, 0);
result.add(new ArrayList<>());
return result; }
public static void main(String[] args) {
int[] nums = {1, 2, 3};
Solution_0085 s = new Solution_0085();
List<List<Integer>> result = s.subsets(nums);
for(List<Integer> inte: result) {
for(Integer i: inte) System.out.print(i + "\t");
System.out.println(); } } }
|
3. 备注
参考力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 (leetcode-cn.com),代码随想录 (programmercarl.com)。