Leetcode 47. Permutations II

多了重复的元素,可以先通过排序,如果当前元素和之前元素相同,且之前的元素没有被visit过,说明前一个元素已经访问过并重新置为没访问过,所以这种情况需要continue。

class Solution {
public:
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        vector<vector<int>> res;
        vector<int> cur;
        vector<bool> visited(nums.size(),false);
        dfs(nums,cur,visited,res);
        return res;
    }
    
    void dfs(vector<int>& nums, vector<int> &cur, vector<bool> visited, vector<vector<int>> &res){
        if (cur.size()==nums.size()){
            res.push_back(cur);
            return;
        }
        for (int i=0;i<nums.size();++i){
            if (!visited[i]){
                if (i>=1 && nums[i]==nums[i-1] && !visited[i-1]) continue; //if !visited, means has been permutated
                visited[i]=true; cur.push_back(nums[i]);
                dfs(nums,cur,visited,res);
                visited[i]=false; cur.pop_back();
            }
        }
    }
};

也可以用之前I的第二种方法,交换,这样就不用排序了,但是为了防止重复的答案,所以需要set

class Solution {
public:
    vector<vector<int>> permuteUnique(vector<int> &nums) {
        set<vector<int>> res;
        dfs(nums,0,res);
        return vector<vector<int>>(res.begin(),res.end());
    }
    void dfs(vector<int> &nums, int start, set<vector<int>> &res) {
        if (start == nums.size()){
            res.insert(nums);
            return;
        }
        
        // permute num[start..end()]
        for (int i=start;i<nums.size();++i){
            if (i!=start && nums[i]==nums[start]) continue;
            swap(nums[start],nums[i]);
            dfs(nums,start+1,res);
            swap(nums[start],nums[i]);
        }
    }
};

猜你喜欢

转载自www.cnblogs.com/hankunyan/p/9590678.html