[LeetCode] Permutation II

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].

思路:交换当前数字和下一个可用的数字,然后递归求出剩下的排列,然后恢复交换前的数字的顺序,然后再交换。。。

和Combination II 比较一下思路。

注意:为了去掉重复的排列,每一个位置上如果某个数字已经出现过,那么就不能再把这个数字交换到这个位置上。为此,可以用一个hash set来保存这个位置上出现过的数字:如果数字没有出现过,那么就把这个数字交换过来,如果已经出现过,那么就不交换。

代码:

class Solution {
public:
    vector<vector<int> > permuteUnique(vector<int> &num) {
        
        int pos=0;
        vector<int> perm;
        vector<vector<int>> perms;
        permuteUniqueUtil(num,pos,perm, perms );    
    
        return perms;
    }
    
    void permuteUniqueUtil(vector<int>& num, int pos, vector<int> perm, vector<vector<int>>& perms )
    {
        if(pos==num.size())
        {
            perms.push_back(perm); 
            return;
        }
        
        set<int> set_; 
        for(int i=pos; i<num.size(); i++)
        {
            if(i==pos)
            {
                set_.insert(num[i]);
                perm.push_back(num[i]);
                permuteUniqueUtil(num, pos+1, perm, perms);
                perm.pop_back();
            }
            else
            {
                if( set_.find(num[i])==set_.end() )// if num[i] has not been placed in position pos before
                {
                    set_.insert(num[i]);
                    
                    // swap num[pos] and num[i]
                    int temp = num[pos];
                    num[pos] = num[i];
                    num[i] = temp;
                    
                    perm.push_back(num[pos]);
                    permuteUniqueUtil(num, pos+1, perm, perms);
                    
                    // swap back num[pos] and num[i]
                    temp = num[pos];
                    num[pos] = num[i];
                    num[i] = temp;
                    
                    perm.pop_back();
            
                }
            }
        }
    }
};


你可能感兴趣的:(LeetCode)