|
| 1 | +// https://leetcode.com/problems/subsets-ii |
| 2 | +// T: O(2^n) |
| 3 | +// S: O(n * 2^n) |
| 4 | + |
1 | 5 | import java.util.ArrayList;
|
2 |
| -import java.util.HashMap; |
| 6 | +import java.util.Arrays; |
3 | 7 | import java.util.LinkedList;
|
4 | 8 | import java.util.List;
|
5 |
| -import java.util.Map; |
6 | 9 |
|
7 | 10 | public class SubsetsII {
|
8 | 11 | public List<List<Integer>> subsetsWithDup(int[] nums) {
|
9 |
| - final Map<Integer, Integer> frequencies = getElementFrequencies(nums); |
| 12 | + Arrays.sort(nums); |
10 | 13 | final List<List<Integer>> result = new ArrayList<>();
|
11 |
| - computeSubSets(frequencies, result, new LinkedList<>(), 0, nums.length); |
| 14 | + helper(result, new LinkedList<>(), nums, 0); |
12 | 15 | return result;
|
13 | 16 | }
|
14 | 17 |
|
15 |
| - private void computeSubSets(Map<Integer, Integer> frequencies, List<List<Integer>> result, LinkedList<Integer> current, int depth, int maxDepth) { |
16 |
| - if (depth == maxDepth) { |
17 |
| - result.add(new ArrayList<>(current)); |
18 |
| - return; |
19 |
| - } |
20 |
| - for (Map.Entry<Integer, Integer> entry : frequencies.entrySet()) { |
21 |
| - if (entry.getValue() > 0) { |
22 |
| - entry.setValue(entry.getValue() - 1); |
23 |
| - computeSubSets(frequencies, result, current, depth + 1, maxDepth); |
24 |
| - current.add(entry.getKey()); |
25 |
| - computeSubSets(frequencies, result, current, depth + 1, maxDepth); |
26 |
| - current.removeLast(); |
27 |
| - entry.setValue(entry.getValue() + 1); |
28 |
| - } |
29 |
| - } |
30 |
| - } |
31 |
| - |
32 |
| - private Map<Integer, Integer> getElementFrequencies(int[] array) { |
33 |
| - final Map<Integer, Integer> frequencies = new HashMap<>(); |
34 |
| - for (int element : array) { |
35 |
| - frequencies.put(element, frequencies.getOrDefault(element, 0) + 1); |
| 18 | + public void helper(List<List<Integer>> result, LinkedList<Integer> current, int[] numbers, int index) { |
| 19 | + result.add(new ArrayList<>(current)); |
| 20 | + for(int i = index ; i < numbers.length ; i++) { |
| 21 | + if(i > index && numbers[i] == numbers[i-1]) continue; |
| 22 | + current.add(numbers[i]); |
| 23 | + helper(result, current, numbers, i + 1); |
| 24 | + current.removeLast(); |
36 | 25 | }
|
37 |
| - return frequencies; |
38 | 26 | }
|
39 | 27 | }
|
0 commit comments