This question requires a recursive call, that loop each element and find all subsets with remaining. When add the element to previous results, don't forget to add the result again, to catch all cases. Add itself when the first index, add empty too.
public class Solution {
public List<List<Integer>> subsetsWithDup(int[] num) {
if(num.length == 0){
return new ArrayList<List<Integer>>();
}
Set<List<Integer>> res = subsetsOps(num, 0);
List<List<Integer>> result = new ArrayList<List<Integer>>();
Iterator it = res.iterator();
while(it.hasNext()){
result.add((List<Integer>) it.next());
}
return result;
}
private Set<List<Integer>> subsetsOps(int[] num, int pos){
Set<List<Integer>> results = new HashSet<List<Integer>>();
results.add(new ArrayList<Integer>());
if(pos == num.length){
return results;
}
Set<List<Integer>> pres = subsetsOps(num, pos + 1);
Iterator it = pres.iterator();
while(it.hasNext()){
List<Integer> pre = (List<Integer>)it.next();
if(pre.size() > 0){
List<Integer> temp = new ArrayList<Integer>();
temp.addAll(pre);
results.add(temp);
}
pre.add(num[pos]);
Collections.sort(pre);
results.add(pre);
}
return results;
}
}
没有评论:
发表评论