Permutations II 全排列 II

给定一个可包含重复数字的序列,返回所有不重复的全排列。

示例:

输入: [1,1,2]
输出:
[
  [1,1,2],
  [1,2,1],
  [2,1,1]
]

思路:我们可以延续上一个的解法Permutation,只需要做一些细节的改动,由于题目要求必须返回不重复的全排列,所以可以把每次遍历到的结果放入set中,即建立一个set<vector<int>> res的数据类型即可。同时还可以做一些优化,比如当nums[i]和nums[left]相等时就不交换,这样可以节省时间。

参考代码如下:

class Solution {
public:
void permuteCore(vector<int>& nums,int start, set<vector<int>> &res) {
	if (start == nums.size()) {
		res.insert(nums);
	}
	for (int i = start; i < nums.size(); i++) {
		if (i!=start && nums[start] == nums[i]) continue;
		swap(nums[start], nums[i]);
		permuteCore(nums, start + 1, res);
		swap(nums[start], nums[i]);
	}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
	set<vector<int>> res;
	if (!nums.size()) return vector<vector<int>>(res.begin(),res.end());
	permuteCore(nums, 0,res);
	return vector<vector<int>>(res.begin(), res.end());
}
};

猜你喜欢

转载自blog.csdn.net/qq_26410101/article/details/81261239