本题源自LeetCode
-------------------------------------------
思路 回溯法
1 数字可能有 -9 ~ 9 19种取值。
2 用一个数组记录每个数字出现的次数。
3 然后用回溯法求解
代码:
int array[19]={0};
vector<vector<int> > permuteUnique(vector<int> &num) {
vector<vector<int>> result;
int n=num.size();
if(n==0)
return result;
for(int i=0;i<n;i++){
array[num[i]+9]++; //初始化记录数组,记录每个数出现的次数
}
backPath(result,num,0,n);
return result;
}
void backPath(vector<vector<int>>& result,vector<int>& path,int cur,int n){
if(cur==n){
result.push_back(path);
return;
}
for(int i=0;i<19;i++){
if(array[i]>0){ //回溯
array[i]--;
path[cur]=i-9;
backPath(result,path,cur+1,n);
array[i]++;
}
}
}
思路2:
利用 stl 库函数 next_peemutation();返回下一个全排列
vector<vector<int> > permuteUnique(vector<int> &num) {
vector<vector<int>> result;
int len=num.size();
if(len==0)
return result;
vector<int> tmp=num;
do{
result.push_back(num);
next_permutation(num.begin(),num.end());
}while(num!=tmp);
return result;
}