problem:
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]
, and [2,1,1]
.
题意:给定一个带重复数字的序列,输出其所有的排列
thinking:
(1)采用DFS,对已经访问过的元素标识
(2)考虑去重:对于重复的数字,规定一个访问顺序即可
先对数组进行排序,这样在DFS的时候,可以先判断前面的一个数是否和自己相等,相等的时候则前面的数必须使用了,自己才能使用,这样就不会产生重复的排列了。
code:
class Solution {
private:
bool canUse[100];
int a[100];
vector<vector<int> > ret;
public:
void dfs(int dep, int maxDep, vector<int> &num)
{
if (dep == maxDep)
{
vector<int> ans;
for(int i = 0; i < maxDep; i++)
ans.push_back(a[i]);
ret.push_back(ans);
return;
}
for(int i = 0; i < maxDep; i++)
if (canUse[i])
{
if (i != 0 && num[i] == num[i-1] && canUse[i-1])
continue;
canUse[i] = false;
a[dep] = num[i];
dfs(dep + 1, maxDep, num);
canUse[i] = true;
}
}
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());
memset(canUse, true, sizeof(canUse));
ret.clear();
dfs(0, num.size(), num);
return ret;
}
};