Permutations II

本文介绍了一种算法,用于从可能包含重复元素的集合中找出所有唯一的排列组合,并通过剪枝技术避免不必要的子树遍历,提高了算法效率。

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

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].


相对于上面的题目,要cut到一些subtree,所以在swap 的时候要判断一下在k和i中间是不是已经存在当前i的值,如果存在就不继续了。


class Solution {
public:
	vector<vector<int> > permute(vector<int> &num) {
		vector<vector<int> > res;
		permute(num, 0, num.size() - 1, res);
		return res;
	}

	bool noswap(int k, int i, const vector<int> num){
		for (int j=k;j<i;j++){
			if (num[j]==num[i]){
				return true;
			}
		}
		return false;
	}
	void permute(vector<int> &input, int k, int n, vector<vector<int> > &res) {
		if (k == n) {
			res.push_back(input);
		} else {
			for (int i = k; i <= n; i++) {
				if (noswap(k,i,input))
					continue;
				int tmp = input[i];
				input[i] = input[k];
				input[k] = tmp;
				permute(input, k + 1, n, res);
				input[k] = input[i];
				input[i] = tmp;
			}
		}
	}
};






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值