问题
例子
思路
-
方法1
-
方法2
推荐使用回溯
代码
//方法1 我自己的
class Solution {
public List<List<Integer>> subsetsWithDup(int[] nums) {
List<List<Integer>> list = new ArrayList<>();
list.add(new ArrayList<Integer>());
//先排序,eg: [4,1,4]->[4,1],[1,4],不对,因为包含重复的子集
Arrays.sort(nums);
for(int n : nums) {
int len = list.size();
for(int i=0; i<len; i++) {
List<Integer> temp = new ArrayList<>(list.get(i));
temp.add(n);
boolean b = false;
for(List<Integer> temp2 : list) {
if(temp.equals(temp2)) {
b=true;
break;
}
}
if(!b) list.add(temp);
}
}
return list;
}
//方法2 回溯
class Solution {
public List<List<Integer>> subsetsWithDup(int[] nums) {
List<List<Integer>> list = new ArrayList<>();
//先排序,eg: [4,1,4]->[4,1],[1,4],不对,因为包含重复的子集
Arrays.sort(nums);
backtrack(nums,list,new ArrayList<Integer>(),0);
return list;
}
public void backtrack(int[] nums, List<List<Integer>> list, List<Integer> temp, int start) {
list.add(new ArrayList<>(temp));
for(int i=start; i<nums.length; i++) {
和上个数字相等就跳过
if(i>start && nums[i]==nums[i-1])
continue;
temp.add(nums[i]);
backtrack(nums,list,temp,i+1);
temp.remove(temp.size()-1);
}
}
}