题目:排列 2
Given a collection of numbers that might contain duplicates, return all possible unique permutations.
Example:
Input: [1,1,2] Output: [ [1,1,2], [1,2,1], [2,1,1] ]
求所有元素的排列,存在重复元素,关于元素的去重,我开始 的想法是将元素按照从小到大的顺序排列,那么重复的元素就相邻,只要判断相邻元素是否相等,就可以去重了。然而问题在于,参与排列的元素要与前面的最早未参与排列的元素进行交换,交换后顺序就乱了,相等的元素就不相邻了,还是不能去重。
后来采用的去重方法是,比较该元素(i)与本层排序的元素[begin,nums.size()-1], 位于i之前的[begin,i-1] 是否重复, 若重复则继续下一个元素,若没有重复则 i = begin,或者 j 比较完所有元素,j = begin - 1,则可以进行排列
注意:没有重复排列,代表同一个父节点的不能有相同的子节点,没有重复元素的全排列见Permutations
class Solution {
public:
void backtraceUniqNum(vector<int>& nums,int begin,vector<vector<int> > &res)
{
if(begin == nums.size())
{
res.push_back(nums);
return;
}
for(int i = begin; i < nums.size(); i++)
{
int j = i - 1;
while(j >= begin && nums[j] != nums[i])
{
j--;
}
if(i == begin || j == begin - 1)
{
swap(nums[begin],nums[i]);
backtraceUniqNum(nums,begin+1,res);
swap(nums[begin],nums[i]);
}
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<vector<int>> res;
if(nums.empty())
return res;
backtraceUniqNum(nums,0,res);
return res;
}
};