[cpp]
class Solution {
//DFS
//always let the next same element go first,
//in such a case we can cut down half same permutations
//generated by these same element
//need more practice
public:
vector<vector<int> > permuteUnique(vector<int> &num) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int n = num.size();
if(0 == n) return vector<vector<int> >();
sort(num.begin(), num.end());
vector<bool> used(num.size(), false);
vector<vector<int>> ans;
vector<int> path;
permute_aux(n, used, path, ans, num);
return ans;
}
void permute_aux( int n, vector<bool>& used, vector<int>& path, vector<vector<int>>& ans, const vector<int>& num )
{
//throw std::exception("The method or operation is not implemented.");
if(0 == n)
{
ans.push_back(path);
return;
}
for (int i = 0; i < used.size(); ++i)
{
if(true == used[i] || (i != 0 && num[i] == num[i-1] && used[i-1]))
continue;
used[i] = true;
path.push_back(num[i]);
permute_aux(n-1, used, path, ans, num);
used[i] = false;
path.pop_back();
}
}
};
class Solution {
//DFS
//always let the next same element go first,
//in such a case we can cut down half same permutations
//generated by these same element
//need more practice
public:
vector<vector<int> > permuteUnique(vector<int> &num) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int n = num.size();
if(0 == n) return vector<vector<int> >();
sort(num.begin(), num.end());
vector<bool> used(num.size(), false);
vector<vector<int>> ans;
vector<int> path;
permute_aux(n, used, path, ans, num);
return ans;
}
void permute_aux( int n, vector<bool>& used, vector<int>& path, vector<vector<int>>& ans, const vector<int>& num )
{
//throw std::exception("The method or operation is not implemented.");
if(0 == n)
{
ans.push_back(path);
return;
}
for (int i = 0; i < used.size(); ++i)
{
if(true == used[i] || (i != 0 && num[i] == num[i-1] && used[i-1]))
continue;
used[i] = true;
path.push_back(num[i]);
permute_aux(n-1, used, path, ans, num);
used[i] = false;
path.pop_back();
}
}
};