递归实现排列枚举

1.无重复元素排列

class Solution {
public:
    vector<vector<int>>res;
    vector<bool>st;
    vector<int>ans;
    void dfs(int k,vector<int>&nums)
    {
        if(k==nums.size())
        {
            res.push_back(ans);
            return ;
        }
        for(int i=0;i<nums.size();i++)
        {
            if(st[i])   continue;
            st[i]=true;
            ans[k]=nums[i];
            dfs(k+1,nums);
            st[i]=false;
        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        st=vector<bool>(nums.size());
        ans=vector<int>(nums.size());
        dfs(0,nums);
        return res;
    }
};

2.有重复元素排列

class Solution {
public:
//保证对于相同数字来说不改变相对顺序,所以选取相同的数字从前往后挨个用
//嫡长子继承制
    vector<vector<int>>res;
    vector<int>ans;
    vector<bool>st;
    void dfs(int k,vector<int>&nums)
    {
        if(k==nums.size())
        {
            res.push_back(ans);
            return ;
        }
        for(int i=0;i<nums.size();i++)
        {
            if(!st[i])
            {
                if(i&&nums[i]==nums[i-1]&&!st[i-1])continue;
                st[i]=true;
                ans[k]=nums[i];
                dfs(k+1,nums);
                st[i]=false;
            }
        }
    }
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        ans=vector<int>(nums.size());
        st=vector<bool>(nums.size());
        sort(nums.begin(),nums.end());
        dfs(0,nums);
        return res;
    }
};
posted @ 2021-07-05 10:33  Tsukinousag1  阅读(60)  评论(0)    收藏  举报