47 Permutations II

本文介绍了一种使用回溯法生成包含重复元素数组的所有唯一排列的方法,并通过排序和标记已使用元素的方式避免重复解的产生。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分析摘自:

https://leetcode.com/discuss/18482/share-my-recursive-solution

Given a collection of numbers that might contain duplicates, return all possible unique permutations.

For example,
[1,1,2] have the following unique permutations:

[1,1,2][1,2,1], and [2,1,1].


回溯法生成全排列+hash判重,可过,不优。


相同的元素为【源】调用生成重复集合,没有顺序?就规定顺序。


排序后将相同的元素和前面的元素【捆绑】以免重复调用。


The idea to resolve duplicate is to ensure that for elements with the same value, we make sure that they are picked up in the ascending order of index. To implement this, every time we try to pick up some value, we just check if the previous element has the same value and is visited or not. If so, we just return!

List<List<Integer>> list=new ArrayList<>();
	ArrayList<Integer> arraylist=new ArrayList<>();
	boolean[] onstack;
	
	public List<List<Integer>> permuteUnique(int[] nums) 
	{
		Arrays.sort(nums);
		onstack=new boolean[nums.length];
		dfs(nums.length, 0, nums);
	
		return list;
	}
	
	
	
	public void dfs(int n,int k,int[] nums)
	{
		if(k==n)
		{
			list.add(new ArrayList<>(arraylist));
			return ;
		}
		
		for(int i=0;i<nums.length;i++)
		{
			if(!onstack[i])
			{
				if(i>0 &&nums[i-1]==nums[i] && !onstack[i-1])
					continue;
				
				arraylist.add(nums[i]);
				onstack[i]=true;
				dfs(nums.length, k+1 , nums);
				onstack[i]=false;
				arraylist.remove(arraylist.size()-1);
			}
		}
	}



### Python 排列组合的使用方法与实例 Python 提供了 `itertools` 模块用于高效循环的各种工具函数。其中,`permutations` 函数可以用来生成给定序列的所有可能排列。 #### 导入 itertools 和 使用 permutations 为了使用排列功能,首先需要导入 `itertools` 模块中的 `permutations` 方法: ```python from itertools import permutations ``` #### 基本用法 当调用 `permutations(iterable, r=None)` 时,该函数返回长度为 `r` 的项迭代器;如果没有提供 `r` 参数,则默认等于可迭代对象的长度。每次迭代都会给出一个新的元组表示一种新的排列方式[^2]。 下面是一个简单的例子展示如何获取列表 `[1, 2, 3]` 中所有元素的不同顺序: ```python for p in permutations([1, 2, 3]): print(p) ``` 这会打印出如下结果: ``` (1, 2, 3) (1, 3, 2) (2, 1, 3) (2, 3, 1) (3, 1, 2) (3, 2, 1) ``` #### 设置排列长度 还可以通过传递第二个参数来设置每种排列的具体长度。比如只想要两个数目的排列情况: ```python print(list(permutations('ABCD', 2))) ``` 这段代码将会输出: ``` [('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'A'), ('B', 'C'), ('B', 'D'), ('C', 'A'), ('C', 'B'), ('C', 'D'), ('D', 'A'), ('D', 'B'), ('D', 'C')] ``` #### 应用场景举例 假设有一个问题是要找出由字符 `'ABC'` 组成的所有三位字母串,并检查这些字符串是否满足某些条件(例如不含有重复字符)。那么就可以利用 `permutations` 来解决这个问题: ```python def has_unique_chars(s): """Check if string s contains all unique characters.""" return len(set(s)) == len(s) perms = [''.join(p) for p in permutations('ABC', 3)] filtered_perms = [p for p in perms if has_unique_chars(p)] print(filtered_perms) ``` 上述程序将创建一个包含所有符合条件的结果列表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值