【ATT】Permutations II
Q: 有重复元素的全排列问题。DFS,注意筛选条件。
vector<vector<int> > permuteUnique(vector<int> &num) { // Start typing your C/C++ solution below // DO NOT write int main() function vector<int> path; vector<vector<int> > result; vector<bool> bvisited(num.size(),false); sort(num.begin(),num.end()); //先对数组排序,使得重复的元素的聚集在一起。 permuteUnique_aux(num,bvisited,path,result); return result; } void permuteUnique_aux(vector<int>& num,vector<bool>& bvisited,vector<int>& path,vector<vector<int> >& result) { if(path.size()==num.size()) //全排列 { result.push_back(path); return; }
//path.size()<n for(int i=0;i<num.size();i++) { if(bvisited[i]||(num[i]==num[i+1]&&bvisited[i+1])) //注意这个条件。如果num[i]已经访问,当然跳过;举个例子,1 1 2 3. 取第一个1的时候,下一个i可以随便取,没有重复;取第二个1,然后回过头来去第一个1,那么这些排列已经在取第一个1的时候出现过了,是重复的。-----错误的,,例如1 1 1 2 3。正确的应该是:
if(bvisited[i]||(num[i]==num[i-1]&&bvisited[i-1])) continue; bvisited[i] = true; path.push_back(num[i]); permuteUnique_aux(num,bvisited,path,result); path.pop_back(); bvisited[i] = false; }
//path.size()<n,且找不到可用于排列的数字,直接返回。
}