Skip to content

Commit b010162

Browse files
committed
rewrite subset II
1 parent 8c8d7b1 commit b010162

File tree

1 file changed

+13
-17
lines changed

1 file changed

+13
-17
lines changed

SubsetsII.java

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
2-
31
import java.util.ArrayList;
42
import java.util.Arrays;
53

@@ -18,23 +16,21 @@
1816

1917
public class SubsetsII {
2018
public ArrayList<ArrayList<Integer>> subsetsWithDup(int[] num) {
19+
ArrayList<ArrayList<Integer>> ret = new ArrayList<ArrayList<Integer>>();
20+
ArrayList<ArrayList<Integer>> lastLevel = null;
21+
ret.add(new ArrayList<Integer>());
2122
Arrays.sort(num);
22-
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
23-
ArrayList<Integer> path = new ArrayList<Integer>();
24-
subsets(num, 0, path, result);
25-
return result;
26-
}
27-
28-
private void subsets(int[] num, int begin, ArrayList<Integer> path,
29-
ArrayList<ArrayList<Integer>> result) {
30-
result.add(new ArrayList<Integer>(path));
31-
for (int i = begin; i < num.length; i++) {
32-
if (i > begin && num[i - 1] == num[i]) {
33-
continue;
23+
for (int i = 0; i < num.length; i++) {
24+
ArrayList<ArrayList<Integer>> tmp = new ArrayList<ArrayList<Integer>>();
25+
ArrayList<ArrayList<Integer>> prev = i == 0 || num[i] != num[i - 1] ? ret : lastLevel;
26+
for (ArrayList<Integer> s : prev) {
27+
ArrayList<Integer> newSet = new ArrayList<Integer>(s);
28+
newSet.add(num[i]);
29+
tmp.add(newSet);
3430
}
35-
path.add(num[i]);
36-
subsets(num, i + 1, path, result);
37-
path.remove(path.size() - 1);
31+
ret.addAll(tmp);
32+
lastLevel = tmp;
3833
}
34+
return ret;
3935
}
4036
}

0 commit comments

Comments
 (0)