描述:
给定一个可能具有重复数字的列表,返回其所有可能的子集
注意事项
- 子集中的每个元素都是非降序的
- 两个子集间的顺序是无关紧要的
- 解集中不能包含重复子集
样例:
如果 S = [1,2,2]
,一个可能的答案为:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
思路:
采用递归 ,插入到最终结果之前去重
class Solution {
/**
* @param nums: A set of numbers.
* @return: A list of lists. All valid subsets.
*/
public ArrayList<ArrayList<Integer>> subsetsWithDup(int[] nums) {
// write your code here
Arrays.sort(nums);
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
for(int i = 0;i<nums.length;i++){
ArrayList<Integer> temp = new ArrayList<Integer>();
temp.add(nums[i]);
search(result , temp , nums , i+1);
}
ArrayList<Integer> t = new ArrayList<Integer>();
result.add(t);
return result;
}
public void search(ArrayList<ArrayList<Integer>> result , ArrayList<Integer> temp , int[] nums , int start){
ArrayList<Integer> p = new ArrayList<Integer>(temp);
if(!result.contains(p)){
result.add(p);
}
if(start >= nums.length){
return ;
}
for(int i = start;i<nums.length;i++){
temp.add(nums[i]);
search(result , temp , nums , i+1);
temp.remove(temp.size() - 1);
}
}
}