代码随想录二刷 | 回溯 |组合总和

代码随想录二刷 | 回溯 |组合总和

  • 题目描述
  • 解题思路
  • 代码实现

题目描述

39.组合总和

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

解题思路

本题搜索的过程抽象成树形结构如下:
在这里插入图片描述
注意图中叶子节点的返回条件,因为本题没有组合数量要求,仅仅是总和的限制,所以递归没有层数的限制,只要选取的元素总和超过target,就返回!

回溯三部曲

  1. 递归函数的参数
    定义两个全局变量,二维数组result存放结果集,数组path存放符合条件的结果。

    首先是题目中给出的参数,集合candidates, 和目标值target。

    此外还需要定义int型的sum变量来统计单一结果path里的总和,startIndex来控制for循环的起始位置。

    vector<vector<int>> result;
    vector<int> path;
    void backtracking(vector<int>& candidates, int target, int sum, int startIndex)
    
  2. 递归函数的终止条件
    终止只有两种情况,sum大于targetsum等于target

    sum等于target的时候,需要收集结果,代码如下:

    if (sum > target) {return;
    }
    if (sum == target) {result.push_back(path);return;
    }
    
  3. 单层搜索的逻辑
    单层for循环依然是从startIndex开始,搜索candidates集合。

    for (int i = startIndex; i < candidates.size(); i++) {sum += candidates[i];path.push_back(candidates[i]);// 关键点:不用i+1了,表示可以重复读取当前的数backtracking(candidates, target, sum, i); sum -= candidates[i];   // 回溯path.pop_back();        // 回溯
    }
    

代码实现

class Solution {
private:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& candidates, int target, int sum, int startIndex) {if (sum > target) {return;}if (sum == target) {result.push_back(path);return;}for (int i = startIndex; i < candidates.size(); i++) {sum += candidates[i];path.push_back(candidates[i]);backtracking(candidates, target, sum, i); // 不用i+1了,表示可以重复读取当前的数sum -= candidates[i];path.pop_back();}}
public:vector<vector<int>> combinationSum(vector<int>& candidates, int target) {result.clear();path.clear();backtracking(candidates, target, 0, 0);return result;}
};

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

503.下一个更大元素II 42.接雨水

503.下一个更大元素II 42.接雨水 503.下一个更大元素II 力扣题目链接(opens new window) 给定一个循环数组&#xff08;最后一个元素的下一个元素是数组的第一个元素&#xff09;&#xff0c;输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序&…

Linux操作系统——理解文件系统

预备知识 到目前为止&#xff0c;我们所学习到的关于文件的操作&#xff0c;全部都是基于文件被打开&#xff0c;被访问&#xff0c;访问期间比较重要的有重定向&#xff0c;缓冲区&#xff0c;一切皆文件&#xff0c;当我们访问完毕的时候需要将文件关闭&#xff0c;关闭时那…

基于FPGA的矩阵键盘驱动

按键数量较多时&#xff0c;为了减少 I/O ⼝的占⽤&#xff0c;通常将按键排列成矩阵形式。在矩阵式键盘中&#xff0c;每条⽔平线和垂直线在交叉处不直接连通&#xff0c;⽽是通过一个按键连接。⼋根线就可以控制4*416个按键&#xff0c;⽐之直接将端⼝线⽤于键盘多出了⼀倍&a…

应用层—HTTP详解(抓包工具、报文格式、构造http等……)

文章目录 HTTP1. 抓包工具的使用1.1 配置信息1.2 观察数据 2. 分析 https 抓包结果3. HTTP请求详解3.1 认识 URL3.1.1 URL 基本格式3.1.2 查询字符串 (query string)3.1.3 关于 URL Encode 3.2 认识 http 方法3.2.1 [经典问题] Get 和 Post 主要的区别是什么&#xff1f;&#…

HubSpot整合小红书,MessageBox助力多系统融合

在当今数字化潮流中&#xff0c;HubSpot与小红书的强大联盟成为了数字化市场的亮点。今天运营坛将深入解析它们的合作策略&#xff0c;聚焦于MessageBox在整合中的关键角色&#xff0c;以及它在推动HubSpot和小红书整合方面的关键作用。 HubSpot与小红书&#xff1a;数字化市场…

数据库设计和数据库对象

目录 序言 一、数据库设计的步骤 二、如何绘制E-R图 2.1 酒店管理系统的基本功能 2.2 绘制E-R 实体关系图&#xff08;三要素&#xff09;&#xff1a; 2.3 关系型数据库常见映射基数&#xff1a; 2.4 转化E-R图形成数据库模型图 三、使用三大范式实现数据库设计规范化…

本地部署轻量级web开发框架Flask并实现无公网ip远程访问开发界面

文章目录 1. 安装部署Flask2. 安装Cpolar内网穿透3. 配置Flask的web界面公网访问地址4. 公网远程访问Flask的web界面 本篇文章主要讲解如何在本地安装Flask&#xff0c;以及如何将其web界面发布到公网进行远程访问。 Flask是目前十分流行的web框架&#xff0c;采用Python编程语…

C++入门学习(七)整型

整型就是整数类型的数据&#xff08;-1&#xff0c;0&#xff0c;1等等&#xff09; 数据类型占用空间取值范围short(短整型)2字节 (-2^15 ~ 2^15-1) 32768~32767 int(整型)4字节(-2^31 ~ 2^31-1)long(长整形) Windows为4字节, Linux为4字节(32位), 8字节(64位) (-2^31 ~ 2^31…

flink部署模式介绍

在一些应用场景中&#xff0c;对于集群资源分配和占用的方式&#xff0c;可能会有特定的需求。Flink 为各种场景提供了不同的部署模式&#xff0c;主要有以下三种&#xff0c;它们的区别主要在于&#xff1a; 集群的生命周期以及资源的分配方式&#xff1b;应用的 main 方法到…

jmeter生成html性能结果报告

从3.0版本开始&#xff0c;jmeter引入了Dashboard Report模块&#xff0c;用于生成HTML类型的可视化图形报告。 1.生成html报告 1.1操作步骤&#xff1a; 进入JMeter的bin目录下&#xff1b;打开命令行窗口&#xff0c;输入以下命令&#xff1a; 对于Windows系统&#xff1a;…

open3d点云平移

功能简介 open3d中点云的平移函数为&#xff1a;pcd.translate((tx, ty, tz), relativeTrue)。当relative为True时&#xff0c;&#xff08;tx, ty, tz&#xff09;表示点云平移的相对尺度&#xff0c;也就是平移了多少距离。当relative为False时&#xff0c;&#xff08;tx, …

HCIA——20应用层:C/S、P2P、peer

学习目标&#xff1a; 计算机网络 1.掌握计算机网络的基本概念、基本原理和基本方法。 2.掌握计算机网络的体系结构和典型网络协议&#xff0c;了解典型网络设备的组成和特点&#xff0c;理解典型网络设备的工作原理。 3.能够运用计算机网络的基本概念、基本原理和基本方法进行…