http://oj.leetcode.com/problems/permutations/
class Solution {
public:
void Permute(vector<int> &num, vector<bool> &used, int depth, vector<vector<int>> &res, vector<int> ¤t){
if(depth==num.size()){
res.push_back(current);
}
else{
for(int i=0;i<used.size();i++){
if(used[i]==false){
current.push_back(num[i]);
used[i]=true;
Permute(num,used,depth+1,res,current);
used[i]=false;
current.pop_back();
}
}
}
}
vector<vector<int> > permute(vector<int> &num) {
vector<bool> used;
for(int i=0;i<num.size();i++) used.push_back(false);
vector<int> current;
vector<vector<int>> res;
Permute(num,used,0,res,current);
return res;
}
};
http://oj.leetcode.com/problems/permutations-ii/
class Solution {
public:
void Permute(vector<int> &num, vector<bool> &used, int depth, vector<vector<int>> &res, vector<int> ¤t){
if(depth==num.size()){
res.push_back(current);
}
else{
for(int i=0;i<used.size();i++){
if(used[i]==false){
current.push_back(num[i]);
used[i]=true;
Permute(num,used,depth+1,res,current);
used[i]=false;
current.pop_back();
// If a number is selected, then skip all the same numbers following
while((i+1)<num.size()&&num[i]==num[i+1]) i++;
}
}
}
}
vector<vector<int> > permuteUnique(vector<int> &num) {
// Sort to keep all the duplicate numbers nearby
sort(num.begin(),num.end());
vector<bool> used;
for(int i=0;i<num.size();i++) used.push_back(false);
vector<int> current;
vector<vector<int>> res;
Permute(num,used,0,res,current);
return res;
}
};