DFS:深搜+回溯+剪枝解决组合问题

这篇具有很好参考价值的文章主要介绍了DFS:深搜+回溯+剪枝解决组合问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

DFS:深搜+回溯+剪枝解决组合问题,递归、搜索与回溯算法总结,深度优先,剪枝,算法,leetcode,c++

                                               创作不易,感谢支持!!!

一、电话号码的组合

. - 力扣(LeetCode)

DFS:深搜+回溯+剪枝解决组合问题,递归、搜索与回溯算法总结,深度优先,剪枝,算法,leetcode,c++

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(path.size()==digits.size()) {ret.push_back(path);return;}
            for(auto ch:hash[digits[pos]-'0'])//从当前位置开始遍历,然后再去下一个里面找
            {
                path.push_back(ch);
                dfs(digits,pos+1);
                path.pop_back();
            }
    }
};

二、括号生成

. - 力扣(LeetCode)

DFS:深搜+回溯+剪枝解决组合问题,递归、搜索与回溯算法总结,深度优先,剪枝,算法,leetcode,c++

class Solution {
public:
    vector<string> ret;
    string path;
    int n;
    vector<string> generateParenthesis(int _n) 
    {
      n=_n;
      dfs(0,0);
      return ret;
    }
    void dfs(int open,int close)//open和close记录上界和下界
    {
        if(path.size()==2*n) {ret.push_back(path);return;}
        if(open<n) 
        {
           path.push_back('(');
           dfs(open+1,close);
           path.pop_back();
        }
        if(close<open)
        {
           path.push_back(')');
           dfs(open,close+1);
           path.pop_back();
        }
    }
};

 三、组合

. - 力扣(LeetCode)

DFS:深搜+回溯+剪枝解决组合问题,递归、搜索与回溯算法总结,深度优先,剪枝,算法,leetcode,c++

class Solution {
public:
    vector<vector<int>> ret;
    vector<int> path;
    int k;//用k全局,可以减少一个参数
    int n;//用n全局,可以减少一个参数
    vector<vector<int>> combine(int _n, int _k) 
    {
       k=_k;
       n=_n;
       dfs(1);
       return ret;
    }

    void dfs(int pos)
    {
        if(path.size()==k) {ret.push_back(path);return;}
        for(int i=pos;i<=n;++i)
        {
            path.push_back(i);
            dfs(i+1);
            path.pop_back();
        }
    }
};

四、目标和

. - 力扣(LeetCode)

DFS:深搜+回溯+剪枝解决组合问题,递归、搜索与回溯算法总结,深度优先,剪枝,算法,leetcode,c++

class Solution {
     int ret=0;//记录返回结果
public:
    int findTargetSumWays(vector<int>& nums, int target) 
    {
        dfs(nums,target,0,0);
        return ret;
    }

    void dfs(vector<int>& nums, int target,int index,int sum)
    {
        if(index==nums.size()) 
        {
            if(sum==target)  ++ret;
        }
        //选正数
        else
        {
        dfs(nums,target,index+1,sum+nums[index]);
        dfs(nums,target,index+1,sum-nums[index]);
        }
    }
    
};

五、组合总和I

. - 力扣(LeetCode)

DFS:深搜+回溯+剪枝解决组合问题,递归、搜索与回溯算法总结,深度优先,剪枝,算法,leetcode,c++

class Solution {
    vector<vector<int>> ret;
    vector<int> path;
public:
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) 
    {
        dfs(candidates,0,target);
        return ret;
    }

    void dfs(vector<int>& candidates,int pos,int target)
    {
     if(target==0){ ret.push_back(path);return;}
     if(target<0) return;
     for(int i=pos;i<candidates.size();++i)//第一层,遍历每个数
      {
        path.push_back(candidates[i]);
        dfs(candidates,i,target-candidates[i]);//要从原先的位置去找
        path.pop_back();
      }
    }
};

DFS:深搜+回溯+剪枝解决组合问题,递归、搜索与回溯算法总结,深度优先,剪枝,算法,leetcode,c++

class Solution {
    vector<vector<int>> ret;
    vector<int> path;
public:
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) 
    {
        dfs(candidates,0,target);
        return ret;
    }

    void dfs(vector<int>& nums,int pos,int target)
    {
     if(target==0){ ret.push_back(path);return;}
     if(target<0||pos==nums.size()) return;
     for(int k=0;k*nums[pos]<=target;++k)//第一层,遍历每个数
      {
        if(k) path.push_back(nums[pos]);
        dfs(nums,pos+1,target-k*nums[pos]);//要从原先的位置去找
      }
      for(int k=1;k*nums[pos]<=target;++k) path.pop_back();//

    }
};

六、组合总和II

. - 力扣(LeetCode)

DFS:深搜+回溯+剪枝解决组合问题,递归、搜索与回溯算法总结,深度优先,剪枝,算法,leetcode,c++

七、组合总和III

. - 力扣(LeetCode)

DFS:深搜+回溯+剪枝解决组合问题,递归、搜索与回溯算法总结,深度优先,剪枝,算法,leetcode,c++

class Solution {
public:
    vector<vector<int>> ret;//记录组合
    vector<int> path;//记录路径
    vector<vector<int>> combinationSum3(int k, int n) { 
        if(n>45) return ret;//剪枝
         dfs(k,n,1);
         return ret;
    }
    void dfs(int k,int n,int pos)
    {
        if(k==0&&n==0) 
        {
            ret.push_back(path);
            return;
        }
        if(n<0||k<0) return;
        for(int i=pos;i<=9;++i)
        {
            path.push_back(i);
            dfs(k-1,n-i,i+1);
            path.pop_back();
        }
    }
};

八、组合总和IV

. - 力扣(LeetCode)

该题和前面是类似的,但是用回溯算法,会超时

DFS:深搜+回溯+剪枝解决组合问题,递归、搜索与回溯算法总结,深度优先,剪枝,算法,leetcode,c++

class Solution {
public:
    int combinationSum4(vector<int>& nums, int target) {
        vector<int> dp(target + 1);
        dp[0] = 1;
        for (int i = 1; i <= target; i++) {
            for (int& num : nums) {
                if (num <= i&& dp[i - num] < INT_MAX - dp[i]) 
                {
                    dp[i] += dp[i - num];
                }
            }
        }
        return dp[target];
    }
};

 DFS:深搜+回溯+剪枝解决组合问题,递归、搜索与回溯算法总结,深度优先,剪枝,算法,leetcode,c++文章来源地址https://www.toymoban.com/news/detail-848361.html

到了这里,关于DFS:深搜+回溯+剪枝解决组合问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 递归、搜索与回溯算法(专题二:深搜)

    往期文章(希望小伙伴们在看这篇文章之前,看一下往期文章) (1)递归、搜索与回溯算法(专题零:解释回溯算法中涉及到的名词)【回溯算法入门必看】-CSDN博客 (2)递归、搜索与回溯算法(专题一:递归)-CSDN博客  深搜是实现递归的一种方式,接下来我们之间从题

    2024年01月20日
    浏览(72)
  • 专题二:二叉树的深搜【递归、搜索、回溯】

    深度优先遍历 (DFS,全称为DepthFirstTraversal),是我们树或者图这样的数据结构中常用的⼀种遍历算法。这个算法会尽可能深的搜索树或者图的分⽀,直到⼀条路径上的所有节点都被遍历完毕,然后再回溯到上⼀层,继续找⼀条路遍历。 在⼆叉树中,常⻅的深度优先遍历为:

    2024年02月07日
    浏览(33)
  • DFS(基础,回溯,剪枝,记忆化)搜索

    DFS(深度优先搜索) 基于递归求解问题,而针对搜索的过程 对于问题的介入状态叫初始状态,要求的状态叫目标状态 这里的搜索就是对实时产生的状态进行分析检测,直到得到一个目标状态或符合要求的最佳状态为止。对于实时产生新的状态的过程叫扩展 搜索的要点: 1.选定初

    2024年04月12日
    浏览(29)
  • 每日OJ题_DFS回溯剪枝⑨_力扣39. 组合总和(两种思路)

    目录 力扣39. 组合总和 解析代码1 解析代码2 39. 组合总和 LCR 081. 组合总和 难度 中等 给你一个  无重复元素  的整数数组  candidates  和一个目标整数  target  ,找出  candidates  中可以使数字和为目标数  target  的 所有   不同组合  ,并以列表形式返回。你可以按  任意顺序

    2024年04月28日
    浏览(23)
  • 【算法】回溯:与递归,dfs的同质与分别,剪枝与恢复现场的详细理解,n皇后的回溯解法及算法复杂度分析。

    目录 ​编辑 1.什么是回溯 2.关于剪枝 3.关于恢复现场 4.题目:二叉树的所有路径(凸显恢复现场:切实感受回溯与深搜) 问题分析 ①函数设置为:void Dfs(root) ②函数设置为:void Dfs(root,path) 解题思想:使⽤深度优先遍历(DFS)求解。 代码实现 5.N后问题 问题分析 4皇后的放置

    2024年04月16日
    浏览(29)
  • 穷举&&深搜&&暴搜&&回溯&&剪枝(3)

    一)字母大小写全排列 784. 字母大小写全排列 - 力扣(LeetCode) 1)从每一个字符开始进行枚举,如果枚举的是一个数字字符,直接忽视 如果是字母的话,进行选择是变还是不变 2)当进行遍历到叶子结点的时候,直接将结果存放到ret里面即可 3)相对于是对于这个决策树做一个深度

    2024年02月14日
    浏览(37)
  • 穷举&&深搜&&暴搜&&回溯&&剪枝(4)

    一)单词搜索: 直接在矩阵中依次找到特定字符串 79. 单词搜索 - 力扣(LeetCode) 画出决策树,只需要做一个深度优先遍历: 1)设计dfs函数:只需要关心每一层在做什么即可,从这个节点开始,开始去尝试匹配字符串的下一个字符,就是从某一个位置的字符开始,上下左右下标看看

    2024年02月09日
    浏览(32)
  • 穷举&&深搜&&暴搜&&回溯&&剪枝(2)

    一)电话号码的字母组合 17. 电话号码的字母组合 - 力扣(LeetCode) 1)画出决策树:只是需要对最终的决策树做一个深度优先遍历,在叶子节点收集结果即可 把图画出来,知道每一层在干什么,代码就能写出来了  2)定义全局变量: 1)定义一个哈希表来处理数字和字符串的映射关系

    2024年02月14日
    浏览(33)
  • 【leetcode】深搜、暴搜、回溯、剪枝(C++)2

    leetcode链接 leetcode链接 leetcode链接 全局变量的超时代码: 原因在于nums的长度最长有20,其2^20次方太大了。但是leetcode居然通过了。 path作为参数的正确代码: leetcode链接 解法一: 解法二: 解法一: 解法二: leetcode链接 leetcode链接 leetcode链接 这里我们着重在剪枝方面上面的

    2024年02月20日
    浏览(28)
  • 【leetcode】深搜、暴搜、回溯、剪枝(C++)3

    leetcode链接 leetcode链接 leetcode链接 leetcode链接

    2024年02月22日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包