Given a collection of integers that might contain duplicates, nums, return all possible subsets (the power set).
Note: The solution set must not contain duplicate subsets.
For example,
If nums = [1,2,2], a solution is:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
题目描述
给定一个可能含有重复数字的数组,求有多少个不重复的子集。
思路
我是看题解做的出来的。因为不知道怎么去筛除重复的数字。递归保证了到达某一元素不会有相同的路径。再加上筛除重复的元素,即得到了所有不重复的子集。
class SubSets {
public ArrayList<ArrayList<Integer>> subsetsWithDup(int[] num) {
Arrays.sort(num);
ArrayList<ArrayList<Integer>> re = new ArrayList<>();
re.add(new ArrayList<>());
dfs(num,0,new ArrayList<Integer>(),re);
return re;
}
public void dfs( int[] nums,int start,ArrayList<Integer> list,ArrayList<ArrayList<Integer>> res ) {
if ( start>=nums.length )
return ;
else {
for ( int i=start; i<nums.length; i++ ) {
if ( i>start && nums[i]==nums[i-1] )
continue;
list.add(nums[i]);
res.add(new ArrayList<>(list));
dfs( nums,i+1,list,res);
list.remove(list.size()-1);
}
}
}
}