[LintCode]Subsets II
class Solution {
/**
* @param S: A set of numbers.
* @return: A list of lists. All valid subsets.
*/
public ArrayList<ArrayList<Integer>> subsetsWithDup(ArrayList<Integer> S) {
// 2015-08-28
// S中可能有重复元素,每个元素只可用一次
// 解集中不可含重复的解
// 解中可以含重复元素
ArrayList<ArrayList<Integer>> rst = new ArrayList<>();
if (S == null || S.size() == 0) {
return rst;
}
Collections.sort(S);
ArrayList<Integer> list = new ArrayList<>();
helper(S, rst, list, 0);
return rst;
}
private void helper(ArrayList<Integer> S, ArrayList<ArrayList<Integer>> rst,
ArrayList<Integer> list, int pos) {
rst.add(new ArrayList<Integer>(list));
// i从pos开始,不用再控制数的深度
for (int i = pos; i < S.size(); i++) {
// 控制树的分支 关键
if (i != pos && S.get(i - 1) == S.get(i)) {
continue;
}
list.add(S.get(i));
helper(S, rst, list, i + 1);
list.remove(list.size() - 1);
}
}
}