Given a collection of numbers that might contain duplicates, return all possible unique permutations.
Example:
Input: [1,1,2] Output: [ [1,1,2], [1,2,1], [2,1,1] ]
Time: O(N!)
Space: O(N)
class Solution: def permuteUnique(self, nums: List[int]) -> List[List[int]]: res = [] if nums is None or len(nums) == 0: return res self.dfs(nums, 0, res) return res def dfs(self, nums, level, res): if level == len(nums): res.append(list(nums)) return my_set = set() for i in range(level, len(nums)): if nums[i] not in my_set: my_set.add(nums[i]) nums[i], nums[level] = nums[level], nums[i] self.dfs(nums, level + 1, res) nums[i], nums[level] = nums[level], nums[i]
class Solution { public List<List<Integer>> permuteUnique(int[] nums) { List<List<Integer>> arrList = new ArrayList<>(); List<Integer> list = new ArrayList<>(); boolean[] visited = new boolean[nums.length]; Arrays.sort(nums); helper(arrList, list, visited, nums); return arrList; } private void helper(List<List<Integer>> arrList, List<Integer> list, boolean[] visited, int[] nums) { if (list.size() == nums.length) { arrList.add(new ArrayList<>(list)); return; } for (int i = 0; i < nums.length; i++) { if (visited[i] || (i > 0 && nums[i] == nums[i - 1] && !visited[i - 1])) { continue; } visited[i] = true; list.add(nums[i]); helper(arrList, list, visited, nums); list.remove(list.size() - 1); visited[i] = false; } } }