思想:
此题允许序列中又重复的元素。
一个判定规则:
(先排序)
如果num[i-1] == num[i] 且 前面的那个数还没有用过的话,则说明这样下去必定会产生重复的排列。
因为进入下一深度,必然会用num[i-1],就形成了num[i],num[i-1]这样的情形,跟先前已经有的num[i-1],num[i]是重复的序列。
class Solution {
public:
//Permutations II
void dfs(vector<int> num, vector<vector<int>> &res,bool *canUse,vector<int> &path) {
if(path.size() == num.size()) {
res.push_back(path);
return;
}
for(int i=0;i<num.size();i++) {
if(canUse[i]) {
if(i!=0 && num[i] == num[i-1] && canUse[i-1] == true) {
continue;
}
canUse[i]=false;
path.push_back(num[i]);
dfs(num, res, canUse, path);
canUse[i]=true;
path.pop_back();
}
}
}
vector<vector<int> > permuteUnique(vector<int> &num) {
vector<vector<int>> res;
vector<int> path;
bool *canUse=new bool[num.size()];;
memset(canUse,true,sizeof(canUse));
sort(num.begin(),num.end());
dfs(num,res,canUse,path);
return res;
}
};