【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,且找不到可用于排列的数字,直接返回。

     }

  

posted @ 2013-08-09 15:30  summer_zhou  阅读(167)  评论(0编辑  收藏  举报