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 }

其他的没什么好说的,都是模式化的东西。

猜你喜欢

转载自www.cnblogs.com/hiyashinsu/p/10727354.html
今日推荐