子集I
题目描述
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/subsets
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路描述
采用回溯法
通过代码
import java.util.ArrayList;
import java.util.List;
class Solution {
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> subsets(int[] nums) {
List<Integer> tmp = new ArrayList<>();
sonNum(nums,0,tmp);
return res;
}
public void sonNum(int[] nums,int start,List<Integer> tmp){
res.add(new ArrayList<>(tmp));
for(int i=start;i<nums.length;i++){
tmp.add(nums[i]);
sonNum(nums,i+1,tmp);
tmp.remove(tmp.size()-1);
}
}
}
子集II
题目描述
给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: [1,2,2]
输出:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/subsets-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
通过代码
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
class Solution {
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> subsetsWithDup(int[] nums) {
Arrays.sort(nums);
List<Integer> tmp = new ArrayList<>();
sonNum(nums,0,tmp);
return res;
}
public void sonNum(int[] nums,int start,List<Integer> tmp){
if (!res.contains(tmp)){
res.add(new ArrayList<>(tmp));
}
for(int i=start;i<nums.length;i++){
tmp.add(nums[i]);
sonNum(nums,i+1,tmp);
tmp.remove(tmp.size()-1);
}
}
}

本文详细介绍了如何使用回溯法解决子集生成问题,包括不含重复元素和含重复元素的整数数组的所有可能子集生成。通过具体示例和Java代码实现,深入解析了子集I和子集II两道LeetCode题目。
433

被折叠的 条评论
为什么被折叠?



