LeetCode刷题--- 组合总和

个人主页:元清加油_【C++】,【C语言】,【数据结构与算法】-CSDN博客

个人专栏

力扣递归算法题

 http://t.csdnimg.cn/yUl2I   

【C++】         

 http://t.csdnimg.cn/6AbpV 

数据结构与算法

 http://t.csdnimg.cn/hKh2l


前言:这个专栏主要讲述递归递归、搜索与回溯算法,所以下面题目主要也是这些算法做的  

我讲述题目会把讲解部分分为3个部分:
1、题目解析

2、算法原理思路讲解

3、代码实现


组合总和

题目链接:组合总和

题目

给你一个 无重复元素 的整数数组 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

解法

题目解析

题目的意思非常简单给我们一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。

示例 :

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

一、画出决策树

以 candidates = [2,3,5] 和 target = 8 为例子

决策树就是我们后面设计函数的思路


二、设计代码

(1)全局变量

    vector<int> path;
    vector<vector<int>> ret;
    int aim;
  • aim(target的值) 
  • ret(存储符合target 值的组合)
  • path(组合的路径记录)

(2)设计递归函数

void dfs(vector<int>& candidates, int pos, int sum);
  • 参数:nums(数组),pos(当前要处理的元素下标),sum(当前的组合相加的和);
  • 返回值:无;
  • 函数作⽤:找出所有组合使得元素和为⽬标值

递归流程:

  1. 递归结束条件:判断 sum 的是否大于 aim ,若 sum 大于 aim 则返回,若 sum 等于 aim 则 将 path 的值放入 ret 后返回
  2. 在每个递归状态中,枚举所有下标 i ,i 等于 pos
    1. ​​​​​​​将candidates[i] 添加⾄ path 数组末尾;
    2. sum 的值加上将candidates[i];
    3. 对第 i 个位置进⾏递归;
    4. 回溯 sum 的值减去将candidates[i] ,再删除 path 数组末尾的元素;

以上思路讲解完毕,大家可以自己做一下了


代码实现

  • 空间复杂度:O(target)。除答案数组外,空间复杂度取决于递归的栈深度,在最差情况下需要递归 O(target) 层。
class Solution 
{
public:
    vector<int> path;
    vector<vector<int>> ret;
    int aim;


    void dfs(vector<int>& candidates, int pos, int sum)
    {
        if (sum > aim )
        {
            return;
        }

        if (sum == aim)
        {
            ret.push_back(path);
            return;
        }

        

        for (int i = pos; i < candidates.size(); i++)
        {
            path.push_back(candidates[i]);
            sum += candidates[i];
            dfs(candidates, i, sum);
            sum -= candidates[i];
            path.pop_back();
        }
    }

    vector<vector<int>> combinationSum(vector<int>& candidates, int target)
    {
        aim = target;
        sort(candidates.begin(), candidates.end());

        dfs(candidates, 0, 0);

        return ret;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/267315.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp怎么动态渲染导航栏的title?

直接在接口请求里面写入以下&#xff1a; 自己要什么参数就写什么参数 本人仅供参考&#xff1a; this.name res.data.data[i].name; console.log(名字, res.data.data[i].name); uni.setNavigationBarTitle({title: this.name}) 效果&#xff1a;

[Linux] MySQL数据库之索引

一、索引的相关知识 1.1 索引的简介 索引是一个排序列表&#xff0c;包含索引值和包含该值的数据行的物理地址&#xff08;类似于 c 语言链表&#xff0c;通过指针指向数据记录的内存地址&#xff09;。 使用索引后可以不用扫描全表来定位某行的数据&#xff0c;而是先通过索…

Redis-运维

转自 极客时间 Redis 亚风 原文视频&#xff1a;https://u.geekbang.org/lesson/535?article681062 Redis 同步 Redis主从数据同步,主从第⼀次同步是全量同步 replicaof 主机 端口 #当前这个机器做Master的备份master如何判断slave是不是第⼀次来同步数据&#xff1a; Repl…

掌握iText:轻松实现固定pdf模板的动态数据填充

推荐语 如果你在工作中需要处理大量的PDF表单&#xff0c;那么使用iText5实现固定PDF模板的动态数据填充&#xff0c;将是一种非常有效的方法。这篇技术文章详细介绍了如何使用iText5库来读取已有的PDF模板&#xff0c;并动态地填充表单数据&#xff0c;生成最终的表单文件。通…

2.苍穹外卖-day02

苍穹外卖-day02 课程内容 新增员工 员工分页查询 启用禁用员工账号 编辑员工 导入分类模块功能代码 功能实现&#xff1a;员工管理、菜品分类管理。 员工管理效果&#xff1a; 菜品分类管理效果&#xff1a; 1. 新增员工 1.1 需求分析和设计 1.1.1 产品原型 一般在做需求分…

基础js逆向练习-登录密码破解(js逆向)

练习平台&#xff1a;逆向账号密码 https://login1.scrape.center/ 直接打开平台&#xff0c;输入密码账号&#xff0c;抓包找到加密的参数携带的位置&#xff0c;这边我们找到的是一个叫token的加密参数&#xff0c;这个参数的携带是一个密文 我们首先考虑一下搜索这个加密的…

正餐---二叉树的OJ题

目录​​​​​​​ 前言&#x1f36f; 1. 检查两颗树是否相同&#x1f947; 1.1 思路分析&#x1fa99; 1.2 代码实现&#x1f9f0; 2. 单值二叉树&#x1f332; 2.1 思路分析&#x1f52e; 2.2 代码实现&#x1f488; 3. 二叉树的前序遍历&#x1f39f;️ 3.1 思路分…

【SpringBoot】之Security进阶使用

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《SpringBoot开发之Security系列》。&#x1f3af…

WORDPRESS付费会员插件Paid Memberships Pro v2.12.5 – Plugin + All Addons

WORDPRESS付费会员插件Paid Memberships Pro v2.12.5 – Plugin All Addons 简介&#xff1a; Paid Memberships Pro是一款功能强大的会员订阅和内容限制管理插件&#xff0c;适用于WordPress网站。它提供了丰富的特性和工具&#xff0c;帮助网站所有者轻松地创建和管理付费…

基于XML配置方式SSM框架西蒙购物网

文章目录 一、网站功能需求二、网站设计思路1、设计模式2、网站前台3、网站后台4、购物流程图 三、网站运行效果四、网站实现步骤&#xff08;一&#xff09;创建数据库与表1、创建数据库 - simonshop2、创建用户表 - t_user3、创建商品类别表 - t_category4、创建商品表 - t_p…

由于找不到msvcp110.dll无法继续执行此代码详细解析

在使用电脑的过程中&#xff0c;我们偶尔会遇到一些错误提示&#xff0c;其中最常见的就是“缺少xxx.dll文件”。这些文件是动态链接库&#xff08;DLL&#xff09;文件&#xff0c;它们包含了许多程序运行所需的函数和资源。而msvcp110.dll就是其中一个常见的DLL文件。这个错误…

matlab 点云最小二乘拟合空间直线(PCA法)

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。爬虫网站自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 见:matlab 点云最小二乘拟合空间直线。 二、代码实现 clc;clear; %% ----

LeetCode 1954. 收集足够苹果的最小花园周长

一、题目 1、题目描述 给你一个用无限二维网格表示的花园&#xff0c;每一个 整数坐标处都有一棵苹果树。整数坐标 (i, j) 处的苹果树有 |i| |j| 个苹果。 你将会买下正中心坐标是 (0, 0) 的一块 正方形土地 &#xff0c;且每条边都与两条坐标轴之一平行。 给你一个整数 need…

第11章 GUI Page429~430 步骤八 支持“十字”形

运行效果&#xff1a; 关键代码&#xff1a; 新增头文件&#xff1a; //item_cruciform.hpp #ifndef ITEM_CRUCIFORM_HPP_INCLUDED #define ITEM_CRUCIFORM_HPP_INCLUDED#include <cmath> #include "item_line.hpp"class CruciformItem : public IItem { pub…

多用户商城系统支付模块解决方案 多用户商城系统分账方案

最近很多朋友咨询多用户商城系统的支付模块解决方案&#xff0c;今天我分享两种主流的解决方式。 多用户商城系统是支持商户入驻的电商平台系统&#xff0c;因为涉及多商户入驻&#xff0c;所以有支付、结算方面的系列处理&#xff0c;目前主流的是两种方式。 一个是统一支付&…

Qt Splitter添加实例

选中界面的两个控件右键【布局】》【使用分裂器水平布局】或者【使用分裂器垂直布局】 界面添加横向竖向的splitter&#xff0c;并且添加比例&#xff0c;这类界面需要代码进行干预&#xff1a; 代码&#xff1a;

玩转Spring状态机

说起Spring状态机&#xff0c;大家很容易联想到这个状态机和设计模式中状态模式的区别是啥呢&#xff1f;没错&#xff0c;Spring状态机就是状态模式的一种实现&#xff0c;在介绍Spring状态机之前&#xff0c;让我们来看看设计模式中的状态模式。 1. 状态模式 状态模式的定义如…

BIT-6-指针(C语言初阶学习)

1. 指针是什么 2. 指针和指针类型 3. 野指针 4. 指针运算 5. 指针和数组 6. 二级指针 7. 指针数组 1. 指针是什么&#xff1f; 指针是什么&#xff1f; 指针理解的2个要点&#xff1a; 指针是内存中一个最小单元的编号&#xff0c;也就是地址平时口语中说的指针&#xff0c;通常…

代码随想录算法训练营 | day59 单调栈 503.下一个更大元素Ⅱ,42.接雨水

刷题 503.下一个更大元素Ⅱ 题目链接 | 文章讲解 | 视频讲解 题目&#xff1a;给定一个循环数组&#xff08;最后一个元素的下一个元素是数组的第一个元素&#xff09;&#xff0c;输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序&#xff0c;这个…

指标体系构建-04-非交易型数据指标体系

参考&#xff1a; 本文参考 1.接地气的陈老师的数据指标系列 2.saas是什么意思&#xff1f;国内十大saas平台 3.SaaS产品数据分析之指标与标签 举个&#x1f330; &#x1f330;&#x1f330;&#x1f330;&#x1f330;&#x1f330;&#x1f330; 运营类指标体系 运营类指…