首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

LeetCode39. 组合总和

编程知识
2024年08月14日 19:45

LeetCode39. 组合总和

题目叙述:

给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的数字可以无限制重复被选取。

说明:

  • 所有数字(包括 target)都是正整数。
  • 解集不能包含重复的组合。

示例 1:

  • 输入:candidates = [2,3,6,7], target = 7,
  • 所求解集为: [ [7], [2,2,3] ]

示例 2:

  • 输入:candidates = [2,3,5], target = 8,
  • 所求解集为: [ [2,2,2,2], [2,3,3], [3,5] ]

思路:

  • 题目中提到同一个数字可以无限制的被选取,那么我们就想,如果这个数组中有0怎么办?那不是无穷选了?但是我们看到题目中说,所有数字都是正整数,所以我们放心了,我们可以先画出递归搜索树来形象的观察我们这题的操作过程

39.组合总和

1.回溯函数的参数以及返回值

  • 我们需要一个一维数组path存放当前路径上的所有元素,并且需要一个二维数组result存放所有的结果。
  • 需要传入一个目标值targetSum,这就是我们的目标和
  • 并且我们需要一个sum来记录当前路径所有元素的总和,其实这个也不是必须的,我们可以通过加减targetSum来实现。不过这里我们介绍使用sum的方法,这样更加直观!

2.递归的中止条件

  • 注意图中叶子节点的返回条件,因为本题没有组合数量要求,仅仅是总和的限制,所以递归没有层数的限制,只要选取的元素总和超过target,就返回!
//当sum≥targetSum就可以返回了
if(sum>=targetSum){
    if(sum==targetSum) result.push_back(path);
    return;
}

3. 单层递归的逻辑

  • 我们通过for循环来控制横向遍历,通过控制递归函数来实现纵向遍历,不过这里的纵向遍历可就不是i+1了,而是i,这里一定要想清楚,因为这道题说一个元素是可以重复选取的!!!所以说纵向遍历的时候,是可以包括当前遍历的元素的,在代码体现上也就是递归函数的参数startindex==i,而不是i+1。

  • 明白了这个之后,我们不难写出代码:

        for(int i=startindex;i<candidates.size();i++){
            sum+=candidates[i];
            path.push_back(candidates[i]);
            //这里是i,并不是i+1,因为同一个元素可以重复取
            backtracking(candidates,targetSum,sum,i);
            sum-=candidates[i];
            path.pop_back();
        }
  • 在这里我们也可以隐藏回溯的过程,代码更简洁,但是初学者不推荐这种写法
        for(int i=startindex;i<candidates.size();i++){
            path.push_back(candidates[i]);
            //将回溯过程隐藏在递归函数当中
            backtracking(candidates,targetSum,sum+candidates[i],i);
            path.pop_back();
        }

代码:

  • 通过上面的分析,我们不难得出代码:
class Solution {
public:
    vector<int> path;
    vector<vector<int> > result;
    void backtracking(vector<int> candidates,int targetSum,int sum,int startindex){
        if(sum>=targetSum){
            if(sum==targetSum) result.push_back(path);
            return;
        }
        for(int i=startindex;i<candidates.size();i++){
            //使用sum加减更直观,也可以隐藏到回溯函数当中。
            sum+=candidates[i];
            path.push_back(candidates[i]);
            //这里是i,并不是i+1,因为同一个元素可以重复取
            backtracking(candidates,targetSum,sum,i);
            sum-=candidates[i];
            path.pop_back();
        }
    }
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        path.clear();result.clear();
        if(candidates.size()==0) return result;
        backtracking(candidates,target,0,0);
        return result;
    }
};
From:https://www.cnblogs.com/Tomorrowland/p/18359746
本文地址: http://www.shuzixingkong.net/article/1106
0评论
提交 加载更多评论
其他文章 PowerShell快速修改多个文件的名称
本文介绍基于PowerShell语言,对文件夹中全部文件的名称加以批量替换、修改的方法。 在之前的文章中,我们介绍了基于Python语言,批量修改大量文件的名称的方法。当时我们修改文件名的需求比较复杂,因此选择了用Python语言来实现;而在我们的需求重命名规则相对比较简单时,则可以基于PowerS
PowerShell快速修改多个文件的名称 PowerShell快速修改多个文件的名称 PowerShell快速修改多个文件的名称
SenseCraft 部署模型到Grove Vision AI V2图像处理模块
今天教大家快速上手Grove Vision AI V2 图像处理模块,我们将一起探讨如何利用 SenseCraft 部署 AI 模型,和如何通过XIAO ESP32C3调用这些模型,轻松实现智能视觉功能!
SenseCraft 部署模型到Grove Vision AI V2图像处理模块 SenseCraft 部署模型到Grove Vision AI V2图像处理模块 SenseCraft 部署模型到Grove Vision AI V2图像处理模块
这次轮到AntV增强Awesome-Graphs
AntV团队迅速将G6图可视化引擎融入Awesome-Graphs项目,发布1.2.0版本,提升交互体验,包括路径高亮、模糊搜索等功能,现邀请体验并征集改进意见。
这次轮到AntV增强Awesome-Graphs 这次轮到AntV增强Awesome-Graphs 这次轮到AntV增强Awesome-Graphs
Java 大文件IO操作效率对比【我说说 你瞅瞅】
Java 文件IO操作效率对比 通过以下几种方式读取数据文件,并连续进行 10 次测试: 1. FileInputStream + byte[] 文件字节输入流 + 字节数组读取方式 2. FileInputStream + Scanner 文件字节输入流 + Scanner 读取方式 3. Fi
上周热点回顾(8.5-8.11)
热点随笔: &#183;&#160;感谢「河南图奕网络」赞助园子,成为第一家创始赞助商&#160;(博客园团队)&#183;&#160;小厂也是厂,3000我也干&#160;(Java3y)&#183;&#160;C#.Net筑基-解密委托与事件&#160;(安木夕)&#183;&#160;莽撞闯荡
Java抽象类和接口 小白版
什么是抽象 抽象就是从多个事物中将共性的,本质的内容抽象出来。 什么是抽象类 Java语言中,用abstract关键字修饰的类叫作抽象类。类本身是不存在的,所以抽象类无法创建对象无法实例化。 在面向对象领域,抽象类主要用来进行类型隐藏。 什么是抽象方法 抽象类中用关键字abstract修饰的方法叫做
Java 代码本地设置Hadoop用户名密码
本文简要介绍了Java 代码本地设置Hadoop用户名密码的两种方法,一种是使用Hadoop的API来设置用户名和密码,另外一种是使用Kerberos认证来连接Hadoop集群,第二种方法也是连接Hadoop集群的推荐方式。
数据裂变,数据库高可用架构设计实践
相关文章 数据库系列:MySQL慢查询分析和性能优化 数据库系列:MySQL索引优化总结(综合版) 数据库系列:高并发下的数据字段变更 数据库系列:覆盖索引和规避回表 数据库系列:数据库高可用及无损扩容 数据库系列:使用高区分度索引列提升性能 数据库系列:前缀索引和索引长度的取舍 数据库系列:MyS
数据裂变,数据库高可用架构设计实践 数据裂变,数据库高可用架构设计实践 数据裂变,数据库高可用架构设计实践