问题:
给出一个具有重复数字的列表,找出列表所有不同的排列。
解题思路:
这里求全排列用的方法是每一位依次与其之后的各个位替换,递归实现。为了避免有重复元素导致的元素重复的问题,只需满足在每一位替换的元素值不发生重复即可。
void execFind(vector<vector<int>> &result, vector<int> cur, vector<int> &nums, int index){
if(index == nums.size()){
result.push_back(cur);
}
//在当前位置替换的值不能重复
set<int> cache;
for(int i = index; i < nums.size(); i++){
if(cache.find(nums[i]) != cache.end()){
continue;
}
cache.insert(nums[i]);
while(i < nums.size() - 1 && nums[i] == nums[i + 1]){
i++;
}
int tmp = nums[i];
nums[i] = nums[index];
nums[index] = tmp;
cur.push_back(nums[index]);
execFind(result, cur, nums, index + 1);
tmp = nums[i];
nums[i] = nums[index];
nums[index] = tmp;
cur.pop_back();
}
}
vector<vector<int> > permuteUnique(vector<int> &nums) {
// write your code here
vector<vector<int>> result;
if(nums.size() < 1)
return result;
sort(nums.begin(), nums.end());
vector<int> cur;
execFind(result, cur, nums, 0);
return result;
}