【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,且找不到可用于排列的数字,直接返回。
}
浙公网安备 33010602011771号