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