专题三:穷举、暴搜、深搜、回溯、剪枝【递归、搜索、回溯】

1、全排列 

专题三:穷举、暴搜、深搜、回溯、剪枝【递归、搜索、回溯】_第1张图片

class Solution {
public:
    vector> ret;
    vector path;
    bool check[7];

    void dfs(vector& nums)
    {
        if(nums.size() == path.size()) 
        {
            ret.push_back(path);
            return;
        }
        for(int i = 0;i < nums.size();i++){
            if(check[i] == false)
            {
                path.push_back(nums[i]);
                check[i] = true;
                dfs(nums);
                //回溯
                path.pop_back();
                check[i] = false;
            }
        }
    }

    vector> permute(vector& nums) {
        dfs(nums);
        return ret;
    }
};

 2、子集

解法一:根据每个元素选/不选来思考:  

专题三:穷举、暴搜、深搜、回溯、剪枝【递归、搜索、回溯】_第2张图片

专题三:穷举、暴搜、深搜、回溯、剪枝【递归、搜索、回溯】_第3张图片

解法二:根据元素个数来思考:

专题三:穷举、暴搜、深搜、回溯、剪枝【递归、搜索、回溯】_第4张图片

class Solution {
public:
    vector path;
    vector> ret;
    vector> subsets(vector& nums) {
        dfs(nums,0);
        return ret;
    }
    void dfs(vector& nums,int pos)
    {
        ret.push_back(path);
        for(int i = pos;i < nums.size();i++){
            path.push_back(nums[i]);
            dfs(nums,i+1);
            path.pop_back();
        }
    }
};

 

你可能感兴趣的:(递归搜索回溯,剪枝,算法,机器学习)