求all的题,DFS + Backtracking
II是考虑原set中有重复元素的情况
Subset I
public class Solution {
public List<List<Integer>> subsets(int[] S) {
List<List<Integer>> res = new ArrayList<>();
List<Integer> ls = new ArrayList<>();
Arrays.sort(S);
helper(res, ls, S, 0);
return res;
}
public void helper(List<List<Integer>> res, List<Integer> ls, int[] S, int beg) {
res.add(new ArrayList<Integer>(ls));
for (int i = beg; i < S.length; i++) {
ls.add(S[i]);
helper(res, ls, S, i + 1);
ls.remove(ls.size() - 1);
}
return;
}
}
Subset II
public class Solution {
public List<List<Integer>> subsetsWithDup(int[] num) {
List<List<Integer>> res = new ArrayList<>();
List<Integer> ls = new ArrayList<>();
Arrays.sort(num);
helper(res, ls, num, 0);
return res;
}
public void helper(List<List<Integer>> res, List<Integer> ls, int[] num, int beg) {
res.add(new ArrayList<Integer>(ls));
for (int i = beg; i < num.length; i++) {
if (i > beg && num[i] == num[i-1]) {
continue; //注意是对beg之后的元素进行查重比较
}
ls.add(num[i]);
helper(res, ls, num, i+1);
ls.remove(ls.size() - 1);
}
}
}