[LeetCode] Permutation II

2254 단어 LeetCode
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와 사고방식을 비교해 보자.
주의: 중복된 배열을 없애기 위해 모든 위치에서 어떤 숫자가 이미 나타났다면 이 숫자를 다시 이 위치로 교환할 수 없습니다.이를 위해hashset으로 이 위치에 나타난 숫자를 저장할 수 있습니다. 숫자가 나타나지 않으면 이 숫자를 교환하고, 이미 나타나면 교환하지 않습니다.
코드:
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();
            
                }
            }
        }
    }
};

좋은 웹페이지 즐겨찾기