Given a collection of numbers that might contain duplicates, return all possible unique permutations.
For example,
[1,1,2]
have the following unique permutations:
[ [1,1,2], [1,2,1], [2,1,1] ]
class Solution {
public:
void recursion(vector<int> num, int i, vector<vector<int> > &res) {
if (i == num.size()) {
res.push_back(num);
return;
}
for (int k = i; k < num.size(); k++) {
if (i != k && num[i] == num[k]) continue;//i,k?????
swap(num[i], num[k]);//一次
recursion(num, i + 1, res);
}
}
vector<vector<int> > permuteUnique(vector<int> &num) {
sort(num.begin(), num.end());//
vector<vector<int> >res;
recursion(num, 0, res);
return res;
}
};
或者跟上一题保持一致的形式,这个更容易记
class Solution {
public:
void dfs(set<vector<int> > &result, vector<int> &num, int start)
{
if(start == num.size())
{
result.insert(num);
return;
}
for(int i = start; i < num.size(); i++)
{
if(i != start && num[i] == num[i-1]) continue;
std::swap(num[i], num[start]);
dfs(result, num, start+1);//start+1注意
std::swap(num[i], num[start]);
}
}
vector<vector<int> > permuteUnique(vector<int> &num)
{
set<vector<int> > result;
std::sort(num.begin(), num.end());
dfs(result, num, 0);
return vector<vector<int>>(result.begin(), result.end());
}
};