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

news/2024/7/20 23:04:12 标签: 深度优先, 剪枝, 算法, leetcode, c++

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

一、电话号码的组合

. - 力扣(LeetCode)

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)

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)

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)

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)

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();
      }
    }
};

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)

七、组合总和III

. - 力扣(LeetCode)

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)

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

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];
    }
};

 


http://www.niftyadmin.cn/n/5476509.html

相关文章

MySQL数据库基础--事务

事务 是一组操作的集合&#xff0c;他是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 默认MySQL的事务是自动提交的&#xff0c;也就是说&#xff0c;当执行…

针对图/网络性能评估函数【networkx库】

简介 networkx 是一个 Python 库&#xff0c;用于创建、操作和研究复杂网络的结构和动态过程&#xff0c;它提供了许多内置函数来评估图的各种性能。 常用函数介绍 1.平均最短路径长度 (average_shortest_path_length)&#xff1a;计算图中所有节点对之间的平均最短路径长度。…

JavaScript笔记 11

目录 01 创建元素的方式 02 BOM概述 03 window 04定时器 05 location对象的使用 07 js特效 08 offset系列相关属性 09 scroll 相关属性 10 client 相关属性 11 window 相关的事件 12 event 相关的属性 01 创建元素的方式 创建元素的三种方式: 1.innerHTML创建元素 …

设计模式:生活中的迭代器模式

迭代器模式可以通过日常生活中的餐厅菜单遍历来类比。想象一下&#xff0c;你走进一家餐厅&#xff0c;服务员给了你一本菜单。这本菜单就像是一个聚合对象&#xff0c;它包含了各种菜品。你可以一页一页地翻阅菜单&#xff0c;这个翻阅的过程就像是使用迭代器来遍历聚合对象的…

本地部署WebSocket服务端结合内网穿透实现公网远程即时通讯

文章目录 1. Java 服务端demo环境2. 在pom文件引入第三包封装的netty框架maven坐标3. 创建服务端,以接口模式调用,方便外部调用4. 启动服务,出现以下信息表示启动成功,暴露端口默认99995. 创建隧道映射内网端口6. 查看状态->在线隧道,复制所创建隧道的公网地址加端口号7. 以…

chrome截屏插件用到的JavaScript 库,图像处理库,

包含的库介绍 javascripts\libs\ InboxSDK.js InboxSDK 是一个 JavaScript 库&#xff0c;用于在 Gmail 中添加应用菜单项目。它允许开发者向 Gmail 的应用菜单添加自己的项目&#xff0c;这些项目通常用于提供高级可折叠面板、导航或发送用户到已注册的不同路由 diigo-image-…

【云开发笔记NO.23】初步了解CODING-TSF-TKE

CODING-TSF-TKE的集成涉及的是腾讯云的产品。具体来说&#xff1a; CODING-TSF-TKE是腾讯云&#xff0c;腾讯公司提供的云服务。 定义&#xff1a; CODING&#xff1a;是腾讯云旗下一站式DevOps研发管理平台。它提供代码托管、项目协同、测试管理、持续集成、制品库、持续部署…

Vue3中父组件向子组件、子组件向父组件、兄弟组件传值

1&#xff0c;父组件向子组件传值 子组件&#xff1a; 子组件中创建一个属性&#xff0c;用来接收父组件传过来的值 props: { id: String, }, <template><VMdEditor v-model"text" height"400px"></VMdEditor><…