leetcode-47. 全排列 II
题目:
代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void dfs(vector<int>& nums,int len,int depth,vector<int>& path,vector<int>& used,vector<vector<int> >& res){
if(len==depth){
res.push_back(path);
return;
}
for(int i=0;i<nums.size();i++){
// 剪枝条件:i > 0 是为了保证 nums[i - 1] 有意义
// 写 !used[i - 1] 是因为 nums[i - 1] 在深度优先遍历的过程中刚刚被撤销选择
if (i > 0 && nums[i] == nums[i - 1] && !used[i - 1]) {
continue;
}else if(!used[i]){
path.push_back(nums[i]);
used[i]=1;
dfs(nums,len,depth+1,path,used,res);
used[i]=0;
path.pop_back();
}
}
}
vector< vector<int> > permuteUnique(vector<int>& nums) {
vector< vector<int> > res;
int len=nums.size();
if(len==0){
return res;
}
sort(nums.begin(),nums.end()); //排序,排序是剪枝的前提
vector<int> path;
vector<int> used(len,0);
dfs(nums,len,0,path,used,res);
return res;
}
int main(){
vector<int> nums;
vector< vector<int> > res;
string s;
int tn=0,fuhao=0;
getline(cin,s);
for(int i=0;i<s.size();i++){
if(s[i]=='-'){
fuhao=1;
}else if(s[i]==' '){
if(fuhao==1){
tn=-tn;
}
nums.push_back(tn);
tn=0;fuhao=0;
}else{
tn=tn*10+s[i]-'0';
}
}
if(fuhao==1){
tn=-tn;
}
nums.push_back(tn);
res=permuteUnique(nums);
for(int i=0;i<res.size();i++){
for(int j=0;j<res[i].size();j++){
cout<<res[i][j]<<" ";
}
cout<<endl;
}
return 0;
}