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();
}
}
};
second time
class Solution {
public:
void permuteUtil(vector<int>& num, vector<bool>& used, vector<int>& path, vector<vector<int> >& allPath)
{
if(path.size() == num.size())
{
allPath.push_back(path);
return ;
}
for(int i = 0; i < num.size(); ++i)
{
if(i >= 1 && num[i] == num[i-1] && used[i-1] == false) continue;
if(!used[i])
{
used[i] = true;
path.push_back(num[i]);
permuteUtil(num, used, path, allPath);
path.pop_back();
used[i] = false;
}
}
}
vector<vector<int> > permuteUnique(vector<int> &num) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
sort(num.begin(), num.end());
vector<vector<int> > allPath;
vector<int> path;
vector<bool> used(num.size(), false);
permuteUtil(num, used, path, allPath);
return allPath;
}
};