【leetcode】深搜、暴搜、回溯、剪枝(C++)1


一、全排列

1、题目描述

leetcode链接
在这里插入图片描述

2、代码

class Solution 
{
   
public:
    // 全局变量
    vector<vector<int>> ret;
    vector<int> path;
    bool check[7]; // 该题目最大到6--用以判断每个字符的使用情况
    vector<vector<int>> permute(vector<int>& nums) 
    {
   
        dfs(nums);
        return ret;
    }
    void dfs(vector<int>& 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;
            }
        }
    }
};

3、解析

在这里插入图片描述

二、子集

1、题目描述

leetcode链接

在这里插入图片描述

2、代码

代码1:

class Solution 
{
   
public:
    // 全局变量
    vector<vector<int>> ret;
    vector<int> path;
    vector<vector<int>> subsets(vector<int>& nums) 
    {
   
        dfs(nums, 0);
        return ret;
    }
    void dfs(vector<int>& nums, int pos)
    {
   
        // 1、递归出口
        if(pos == nums.size())
        {
   
            ret.push_back(path);
            return;
        }
        // 2、选
        path.push_back(nums[pos]);
        dfs(nums, pos + 1); // 递归到下一层
        path.pop_back(); // 恢复现场
        // 3、不选
        dfs(nums, pos + 1);
    }
};

代码2:

class Solution 
{
   
public:
    // 全局变量
    vector<vector<int>> ret;
    vector<int> path;
    vector<vector<int>> subsets(vector<int>& nums) 
    {
   
        dfs(nums, 0);
        return ret;
    }
    void dfs(vector<int>& nums, int pos)
    {
   
        // 1、递归出口
        ret.push_back(path);
        // 2、递归
        for (int i = pos; i < nums.size(); i++)
        {
   
            path.push_back(nums[i]);
            dfs(nums, i + 1);
            path.pop_back(); // 恢复现场
        }
    }
};

3、解析

在这里插入图片描述
在这里插入图片描述

三、找出所有子集的异或总和再求和

1、题目描述

leetcode链接

在这里插入图片描述

2、代码

class Solution 
{
   
public:
    // 1、全局变量
    int sum = 0; // 记录最终结果
    int path = 0; // 记录当前异或后的值
    int subsetXORSum(vector<int>& nums) 
    {
   
        dfs(nums, 0);
        return sum;
    }
    // 2、递归
    void dfs(vector<int>& nums, int pos)
    {
   
        // 1、递归出口
        sum += path;
        // 2、往下递归
        for(int i = pos; i < nums.size(); i++)
        {
   
            path ^= nums[i];
            dfs(nums, i + 1);
            path ^= nums[i];
        }
    }
};

3、解析

在这里插入图片描述

四、全排列II

1、题目解析

leetcode链接

在这里插入图片描述

2、代码

代码1:

class Solution 
{
   
public:
    // 1、全局变量
    vector<vector<int>> ret; // 记录返回的数组
    vector<int> path; // 记录路径
    bool check[9]; // 判断是否被使用过
    vector<vector<int>> permuteUnique(vector<int>& nums) 
    {
   
        // 2、排序
        sort(nums.begin(), nums.end());
        // 3、进行递归
        dfs(nums, 0);
        return ret;
    }
    void dfs(vector<int>& nums, int pos)
    {
   
        // 1、递归出口
        if(pos == nums.size())
        {
   
            ret.push_back(path);
            return;
        }
        // 2、每一层的循环
        for(int i = 0; i < nums.size(); i++)
        {
   
            // 不合法情况进行剪枝
            if(check[i] == true || (i != 0 && nums[i] == nums[i - 1] && check[i - 1] == false))
                continue;
            // path进行增加
            path.push_back(nums[i]);
            check[i] = true;
            // 递归
            dfs(nums, pos + 1);
            // 回溯 -- 恢复现场
            path.pop_back();
            check[i] = false;
        }
    }
};

代码2:

class Solution 
{
   
public:
    // 1、全局变量
    vector<vector<int>> ret; // 记录返回的数组
    vector<int> path; // 记录路径
    bool check[9]; // 判断是否被使用过
    vector<vector<int>> permuteUnique(vector<int>& nums) 
    {
   
        // 2、排序
        sort(nums.begin(), nums.end());
        // 3、进行递归
        dfs(nums, 0);
        return ret;
    }
    void dfs(vector<int>& nums, int pos)
    {
   
        // 1、递归出口
        if(pos == nums.size())
        {
   
            ret.push_back(path);
            return;
        }
        // 2、每一层的循环
        for(int i = 0; i < nums.size(); i++)
        {
   
            // 不合法情况进行剪枝
            if(check[i] == false && (i == 0 || nums[i] != nums[i - 1] || check[i - 1] == true))
            {
   
                // path进行增加
                path.push_back(nums[i]);
                check[i] = true;
                // 递归
                dfs(nums, pos + 1);
                // 回溯 -- 恢复现场
                path.pop_back();
                check[i] = false;
            }
        }
    }
};

3、解析

在这里插入图片描述

五、电话号码的字母组合

1、题目描述

leetcode链接

在这里插入图片描述

2、代码

class Solution 
{
   
public:
    // 全局变量
    string hash[10] = {
   "", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
    string path; // 记录路径
    vector<string> ret; // 返回的组合
    vector<string> letterCombinations(string digits) 
    {
   
        if(digits.size() == 0)
            return ret;
        dfs(digits, 0);
        return ret;
    }
    void dfs(string& digits, int pos)
    {
   
        // 递归出口
        if(digits.size() == pos)
        {
   
            ret.push_back(path);
            return;
        }
        // 循环找对应关系
        for(auto ch : hash[digits[pos] - '0']) // 掏出来字符串进行遍历当前下标所对应的字符串
        {
   
            // 尾插进去
            path.push_back(ch);
            dfs(digits, pos + 1);
            path.pop_back(); // 恢复现场
        }
    } 
};

3、解析

在这里插入图片描述

最近更新

  1. TCP协议是安全的吗?

    2024-02-07 08:32:01       17 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-07 08:32:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-07 08:32:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-07 08:32:01       18 阅读

热门阅读

  1. 【C/C++】基本数据类型—数组、指针和引用

    2024-02-07 08:32:01       23 阅读
  2. Flask实现异步调用sqlalchemy的模型类

    2024-02-07 08:32:01       28 阅读
  3. 正则表达式 regex

    2024-02-07 08:32:01       36 阅读
  4. jvm一级缓存

    2024-02-07 08:32:01       30 阅读
  5. kyuubi 接入starrocks | doris

    2024-02-07 08:32:01       31 阅读
  6. VLM 系列——LLaVA-MoLE——论文解读

    2024-02-07 08:32:01       29 阅读
  7. ef core原始sql查询

    2024-02-07 08:32:01       28 阅读
  8. dynamic_cast运行阶段类型识别

    2024-02-07 08:32:01       33 阅读
  9. 详细了解Node.js的配置与使用!

    2024-02-07 08:32:01       27 阅读
  10. Python程序设计 深浅拷贝

    2024-02-07 08:32:01       30 阅读
  11. 腾讯云主机部署spring boot程序

    2024-02-07 08:32:01       30 阅读