首页 > 其他分享 >递归例题 力扣39 组合总数

递归例题 力扣39 组合总数

时间:2023-09-19 21:16:46浏览次数:43  
标签:tmp 39 target sum 力扣 vector candidates ans 例题

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。

candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。 

对于给定的输入,保证和为 target 的不同组合数少于 150 个。

 

示例 1:

输入:candidates = [2,3,6,7], target = 7
输出:[[2,2,3],[7]]
解释:
2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。
7 也是一个候选, 7 = 7 。
仅有这两种组合。

示例 2:

输入: candidates = [2,3,5], target = 8
输出: [[2,2,2,2],[2,3,3],[3,5]]

示例 3:

输入: candidates = [2], target = 1
输出: []

提示:

  • 1 <= candidates.length <= 30
  • 2 <= candidates[i] <= 40
  • candidates 的所有元素 互不相同
  • 1 <= target <= 40

 

class Solution {
public:
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        vector<vector<int>>ans;
        vector<int>tmp;
        f(candidates,target,0,0,ans,tmp);
        return ans;
    }

    void f(vector<int>& candidates, int target,int i,int sum,vector<vector<int>> & ans,vector<int>&tmp){
        if(sum > target)   //减少计算
            return;
        if(sum == target){
            ans.push_back(tmp);
            return;
        }
        if(i == candidates.size())
            return;

        //写出来发现看不懂,就理解为 每个元素 加x个 或 不加 吧。举例分析是每进入一个递归总体都是加 x个can[i] 或不加。比如先加1个2,下一层 加1个3 在下一次加1个6 下一层target>sum退出,在加2个6,下一层退出,直到加完for,在走下面的不加6。 是从底层往上体现加x个的,
        int k = sum;
        vector<int> t = tmp;
        for(int j = candidates[i]; j <= target; j +=candidates[i]){ // 处理重复元素
            tmp.push_back(candidates[i]);
            sum+=candidates[i];
            f(candidates,target,i+1,sum,ans,tmp);    
        }
        sum = k;
        tmp = t;
        f(candidates,target,i+1,sum,ans,tmp);     
    }
};

//这才是正常方法。
class Solution {
public:
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        vector<vector<int>>ans;
        vector<int>tmp;
        f(candidates,target,0,0,ans,tmp);
        return ans;
    }
    void f(vector<int>& candidates, int target,int i,int sum,vector<vector<int>> & ans,vector<int>&tmp){
        if(sum > target)   //减少计算
            return;
        if(sum == target){
            ans.push_back(tmp);
            return;
        }
        if(i == candidates.size())
            return;

        tmp.push_back(candidates[i]);  // 加2 下一层 加2 下一层 加2 下一层 加2 下一层退回 删1个2,走下面,下一层 退回。此时第3个2的函数执行完毕,
                            退回到第2个2的函数,删1个2,此时还有2个2,走下面,下一层,加3 下一层 符合要求 返回。 f(candidates,target,i,sum+candidates[i],ans,tmp); tmp.pop_back(); f(candidates,target,i+1,sum,ans,tmp); //走下一个 } };

 

标签:tmp,39,target,sum,力扣,vector,candidates,ans,例题
From: https://www.cnblogs.com/fyjie/p/17715784.html

相关文章

  • 力扣1.两数之和
    给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。 示例1:输入:nums=[2,......
  • 关于正则表达式 g,m 参数的总结,为了回答“正则表达式(/[^0-9]/g,'')中的"/g"是什么意
    为了解答“正则表达式(/[^0-9]/g,'')中的"/g"是什么意思?”这个问题,也为了能够便于大家对正则表达式有一个更为综合和深刻的认识,我将一些关键点和容易犯糊涂的地方再系统总结一下。 总结1:附件参数g的用法 表达式加上参数g之后,表明可以进行全局匹配,注意这里“可以”的含义。我们详......
  • 【原创】135、137、138、139、445端口大揭秘
        我是一位名不见经传的凡人小鲜肉一枚,本来不想作自我介绍一翻,但是每次又总想以这样的方式和大家打声招呼,就像冯巩每次一见到大家,不都是:我想死你们了!是的,我是龙少一郎,今天我要为大家带来端口大揭秘,看看常用的135、137、138、139、445端口在平时的电脑系统中有什么样的非......
  • [BCB]E2089 Identifier 'ReadPragram' cannot have a type qualifier
    这些天一直在改程序,今天突然冒出来如下错误:[C++Error]Unit1.cpp(4114):E2089Identifier'ReadPragram'cannothaveatypequalifier[C++Error]Unit1.cpp(6751):E2089Identifier'Button1Click'cannothaveatypequalifier[C++Error]Unit1.cpp(8593):E2139D......
  • 无法访问MySQL,错误代码1045 (28000): 用户'bill'@'localhost'被拒绝访问
    这个错误通常是由于权限设置不正确或者密码错误导致的。你可以尝试以下解决方案来解决这个问题:确保密码输入正确:在输入密码时要注意区分大小写,确保将正确的密码输入。检查用户权限:使用root用户登录MySQL,执行以下命令来查看用户bill的权限:SHOWGRANTSFOR'bill'@'localhost';确认用......
  • KingbaseES数据库适配Activiti7 didn't put process definition问题处理过程
    一、Activiti介绍Activiti是一个轻量级的java开源BPMN2工作流引擎.目前以升级至7.x,支持与springboot2.x集成.二、项目环境SpringBoot版本2.2.5Activiti版本7.1.x源数据库:MySQL5.7目标数据库:KinbgaseESV008R006C007B0024JDBC驱动:Postgre形态的JDBC驱动,postgresql-42.......
  • 2023-09-18 taro小程序之onGetPhoneNumber无法获取用户手机号回调?console.log没反应??==
    问题描述:一个微信登录按钮,点击获取用户手机号进而登录;按钮用的是taro框架的button组件,其中用到button的onGetPhoneNumber方法,给这个方法绑定一个事件A,用户点击获取手机号后产生回调进而做下一步的业务;问题就是事件A没有获得任何回调,仿佛onGetPhoneNumber不存在。原因:没有满足使用......
  • 代码随想录算法训练营day13| ● 239. 滑动窗口最大值 ● 347.前 K 个高频元素 ● 总结
    239.滑动窗口最大值mydemo--(自己思路)--failed超出时间限制classSolution{public:vector<int>maxSlidingWindow(vector<int>&nums,intk){vector<int>result;stack<int>stack;intlen=nums.size();for(......
  • 每天一个linux命令(39):grep 命令
    Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格......
  • Rockchip RK3399 - USB触摸屏接口驱动
    ----------------------------------------------------------------------------------------------------------------------------开发板:NanoPC-T4开发板eMMC:16GBLPDDR3:4GB显示屏:15.6英寸HDMI接口显示屏u-boot:2023.04linux:6.3----------------------------------......