子集II
题目描述:
给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。
class Solution {
private int[] nums;
private int len;
private List<List<Integer>> result;
private List<Integer> temp;
public List<List<Integer>> subsetsWithDup(int[] nums) {
// 初始化
this.nums = nums;
this.len = nums.length;
this.result = new ArrayList<List<Integer>>();
this.temp = new ArrayList<Integer>();
Arrays.sort(nums); // 去重关键1
DFS(0);
return result;
}
private void DFS(int begin){
this.result.add(new ArrayList<Integer>(this.temp));
for(int i = begin ; i<len ; i++){
if(i != begin && nums[i-1] == nums[i]) continue; // 去重关键2
// 选择该下标元素
temp.add(nums[i]);
DFS(i+1);
// 不选择该下标元素
temp.remove(temp.size()-1);
}
}
}
该题的主要难点就是如何去重,这里去重思路首先是需要排序,然后在该层处理相邻相等元素使用上只会出现一次,至于这里没有显示地出现递归结束条件,是因为该题就是求解子集的问题,即不需要增加长度限制条件,这个for循环就是一个递归结束条件。详细请看代码,有疑问欢迎留言。