leetcode 47 包含重复的全排列
思路:
和基础版的全排列很像。关键在于:需要判断同样值的元素在当次递归的for循环中是否已经处理过,如果已经处理过,则忽略。这里选择用map来记录。
1 class Solution { 2 private List<List<Integer>> ans = new ArrayList<>(); 3 public List<List<Integer>> permuteUnique(int[] nums) { 4 ans.clear(); 5 if (nums == null || nums.length == 0) { 6 return ans; 7 } 8 int n = nums.length; 9 helper(nums, new ArrayList<Integer>(), 0, n); 10 return ans; 11 } 12 13 public void helper(int[] nums, List<Integer> tmp, int k, int n) { 14 if (k == n) { 15 ans.add(new ArrayList<Integer>(tmp)); 16 return; 17 } 18 19 Map<Integer, Boolean> isVisit = new HashMap<>(); 20 for (int i = k; i < n; i++) { 21 if (!isVisit.containsKey(nums[i])) { 22 tmp.add(nums[i]); 23 swap(nums, k, i); 24 helper(nums, tmp, k + 1, n); 25 swap(nums, k, i); 26 tmp.remove(tmp.size() - 1); 27 isVisit.put(nums[i], true); 28 } 29 } 30 } 31 32 public void swap(int[] nums, int i, int j) { 33 int tmp = nums[i]; 34 nums[i] = nums[j]; 35 nums[j] = tmp; 36 return; 37 } 38 }
其他的没什么好说的,都是模式化的东西。