leetcode 47 包含重复的全排列

本文深入探讨了一种改进的全排列算法,特别关注在处理包含重复元素的数组时如何避免生成重复的排列组合。通过使用哈希映射记录已处理元素状态,该算法能够高效地生成所有不重复的排列,适用于解决LeetCode等平台上的相关问题。

思路:

和基础版的全排列很像。关键在于:需要判断同样值的元素在当次递归的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 }

 

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

 

转载于:https://www.cnblogs.com/hiyashinsu/p/10727354.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值