问题描述:
Given a collection of numbers that might contain duplicates, return all possible unique permutations.
示例:
[1,1,2]
have the following unique permutations:
[ [1,1,2], [1,2,1], [2,1,1] ]问题分析:
利用回溯算法,设置好标志数组,在遍历过程中,记录好那些数据已被使用过,以免重复使用。
过程详见代码:
class Solution {
public:
vector<vector<int> > permuteUnique(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<vector<int> > res;
vector<int> re;
vector<bool> used(nums.size(),0);
bt_permuteUnique(res,re,nums,used);
return res;
}
void bt_permuteUnique(vector<vector<int> >& res, vector<int>& re,vector<int>& nums,vector<bool>& used)
{
for(int i = 0; i < nums.size(); i++)
{
if(!used[i])
{
if(i && nums[i] == nums[i - 1] && !used[i - 1]) continue;
re.push_back(nums[i]);
used[i] = true;
if(re.size() == nums.size())
{
res.push_back(re);
}
else bt_permuteUnique(res,re,nums,used);
re.pop_back();
used[i] = false;
}
}
}
};