题目:
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] ]
题意:
给出数组元素(有重复元素)的全排列,注意去重
思路:
参考40、46两题做出来的,我自己也很迷啊,怎么说好呢?利用set容器去重,总感觉是邪魔外道啊!!!而且耗时好长,看来我还是不会剪枝~参考某大佬解法,才发现跟昨天做的40题的去重有异曲同工之妙,由于我是边递归边交换,没有利用其它数组来存储,所以剪枝条件中的nums[i]==nums[i-1]改成nums[i]==nums[cnt]
Code:
260ms:
class Solution {
public:
int len;
set<vector<int>> q;
void dfs(vector<int> nums,int cnt){
if(cnt==len){
q.insert(nums);
return;
}
for(int i=cnt;i<len;i++){
swap(nums[cnt],nums[i]);
dfs(nums,cnt+1);
swap(nums[cnt],nums[i]);
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
len=nums.size();
dfs(nums,0);
return vector<vector<int>> (q.begin(),q.end());
}
};
76ms:
class Solution {
public:
int len;
set<vector<int>> q;
void dfs(vector<int> nums,int cnt){
if(cnt==len){
q.insert(nums);
return;
}
for(int i=cnt;i<len;i++){
if(i>cnt&&nums[i]==nums[cnt]) continue; //剪枝
swap(nums[cnt],nums[i]);
dfs(nums,cnt+1);
swap(nums[cnt],nums[i]);
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
len=nums.size();
dfs(nums,0);
return vector<vector<int>> (q.begin(),q.end());
}
};