LeetCode78.subsets
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集
回溯思想如下图:
用递归方法求解:
1.两次递归调用(Java代码)
class Solution {
public List<List<Integer>> subsets(int[] nums) {
ArrayList<List<Integer>> result = new ArrayList<List<Integer>>();
ArrayList<Integer> item = new ArrayList<Integer>();
result.add(new ArrayList<Integer>(item));//此处不要用result.add(temp);会是空集
generate(0,nums,item,result);
System.out.println(result);
return result;
}
public static void generate(int i,int[] nums,List<Integer> item,List<List<Integer>> result) {
// 递归调用函数
if (i == nums.length){
return;
}
item.add(nums[i]);
result.add(new ArrayList<Integer>(item));//此处不要用result.add(temp);会是空集
generate(i+1, nums, item, result);
item.remove(item.size()-1);
generate(i+1, nums, item, result);
}
}
2.一次递归调用(Java代码)
class Solution {
public List<List<Integer>> subsets(int[] nums) {
ArrayList<List<Integer>> result = new ArrayList<List<Integer>>();
ArrayList<Integer> item = new ArrayList<Integer>();
result.add(new ArrayList<Integer>(item));//此处不要用result.add(temp);会是空集
generate(0,nums,item,result);
System.out.println(result);
return result;
}
public static void generate(int j,int[] nums,List<Integer> item,List<List<Integer>> result) {
// 递归调用函数
result.add(new ArrayList<Integer>(item));//此处不要用result.add(temp);会是空集
for(int i=j;i<nums.length;i++){
item.add(nums[i]);
generate(i+1, nums, item, result);
item.remove(item.size()-1);
}
}
}
LeetCode90.subsets2
给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: [1,2,2]
输出:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
该题和上题的区别是子集不要有重复的集合,即对数组进行排序,并对数组中元素相邻且相同的元素不再进行子集组合,按次序往下进行下一个元素,并进行判断。
class Solution {
public List<List<Integer>> subsetsWithDup(int[] nums) {
Arrays.sort(nums);
ArrayList<Integer> temp = new ArrayList<Integer>();
ArrayList<List<Integer>> result = new ArrayList<List<Integer>>();
// result.add(new ArrayList<Integer>(temp));
generate(0,nums,temp,result);
return result;
}
public void generate(int j,int[] nums,ArrayList<Integer> temp,ArrayList<List<Integer>> result) {
result.add(new ArrayList<Integer>(temp));
for ( int i = j; i < nums.length;i++){
if(i >j && nums[i] == nums[i-1])
continue;
temp.add(nums[i]);
generate(i+1,nums,temp,result);
temp.remove(temp.size()-1);
}
}
}
如有疑问 ,请留言联系。