【算法】【搜索和回溯】Leetcode全排列

46. 全排列

题目链接:https://leetcode-cn.com/problems/permutations/

class Solution {
public:
    vector<bool> flag;
    vector<vector<int>> res;
    vector<vector<int>> permute(vector<int>& nums) {
        int n = nums.size();
        flag.resize(n, false);
        vector<int> path(n, -1);
        dfs(nums, path, 0, n); 

        return res;
    }

    void dfs(vector<int>& nums, vector<int>& v, int u, int n)
    {
        if(u == n)
        {
            res.push_back(v);
            return ;
        }

        for(int i = 0; i < n; i++)
            if(!flag[i])
            {

                v[u] = nums[i];
                flag[i] = true;
                dfs(nums, v, u + 1, n);
                flag[i] = false;
                v[u] = -1;
            }
    }

};

47. 全排列II

题目链接:https://leetcode-cn.com/problems/permutations-ii/

class Solution {
public:
    vector<bool> flag;
    vector<vector<int>> res;


    vector<vector<int>> permuteUnique(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        int n = nums.size();
        flag.resize(n, false);
        
        vector<int> path(n, -1);
   
        dfs(nums, path, 0, n); 

        return res;
    }

    void dfs(vector<int>& nums, vector<int>& v, int u, int n)
    {
        if(u == n)
        {
            res.push_back(v);
            return ;
        }

        for(int i = 0; i < n; i++){
            //flag[i]已经使用过了
            //i - 1为了防止越界
            //nums[i] == nums[i - 1]
            //flag[i - 1]已经用过
            //剪枝的位置:前一个元素和当前元素相同,并且前一个元素刚刚回溯,刚刚被撤销选择
            if(flag[i] || (i > 0 && nums[i] == nums[i -1] && !flag[i - 1]))
                continue;

            v[u] = nums[i];
            flag[i] = true;
            dfs(nums, v, u + 1, n);
            flag[i] = false;
            v[u] = -1;
        }
            
    }

};
posted @ 2020-08-16 16:47  NaughtyCoder  阅读(96)  评论(0)    收藏  举报