LeetCode 热题 100_组合总和(58_39_中等_C++)(递归(回溯))
LeetCode 热题 100_组合总和(58_39)
- 题目描述:
- 输入输出样例:
- 题解:
- 解题思路:
- 思路一(递归(回溯)):
- 代码实现
- 代码实现(思路一(递归(回溯))):
- 以思路一为例进行调试
题目描述:
给你一个 无重复元素 的整数数组 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
题解:
解题思路:
思路一(递归(回溯)):
1、使用回溯的方法解组合问题时,最好的方法是画出递归树进行分析。

通过递归树不难分析出:
①、递归出口:sum==target(记录答案+回溯) 或者 sum>target(回溯)
我们可以记录path中的总和为sum,通过sum与target的比较来判断。也可以使用target-path数组中的元素与0进行比较来判断,其效果相同。
②、递归体:sum < target(查找可能的组合)
2、复杂度分析:
① 时间复杂度:O(S),其中 S 为所有可行解的长度之和(也就是递归树的节点数)。
② 空间复杂度:O(target)。除答案数组外,空间复杂度取决于递归的栈深度(也就是上图递归树的深度),在最差情况下需要递归 O(target) 层。
代码实现
代码实现(思路一(递归(回溯))):
class Solution {
private://记录其中一个组合vector<int> path;//记录所有满足组合总和的组合vector<vector<int>> ans;//递归(回溯)计算组合总和void backtracking(vector<int>& candidates, int target,int startIndex){//为目标数 “target” 的一个组合,存储到ans中if (target==0){ ans.emplace_back(path);return;}//当path中的数据大于“target”返回(path无需再添加元素,需减少元素)if (target<0) return;//注意这里i的开始位置,是为了避免出现“全排列”类型的重复for (int i = startIndex; i < candidates.size(); i++){path.emplace_back(candidates[i]);//继续添加其他元素,注意一个元素可以重复添加所以startIndex=ibacktracking(candidates,target - candidates[i],i);//回溯(和path.emplace_back(candidates[i])对应)path.pop_back();}}public:vector<vector<int>> combinationSum(vector<int>& candidates, int target) {//清空ans和path中的数据,防止上次调用存在数据残留ans.clear();path.clear();//递归(回溯)计算组合总和backtracking(candidates,target,0);return ans;}
};
以思路一为例进行调试
#include<iostream>
#include <vector>
using namespace std;class Solution {
private://记录其中一个组合vector<int> path;//记录所有满足组合总和的组合vector<vector<int>> ans;//递归(回溯)计算组合总和void backtracking(vector<int>& candidates, int target,int startIndex){//为目标数 “target” 的一个组合,存储到ans中if (target==0){ ans.emplace_back(path);return;}//当path中的数据大于“target”返回(path无需再添加元素,需减少元素)if (target<0) return;//注意这里i的开始位置,是为了避免出现“全排列”类型的重复for (int i = startIndex; i < candidates.size(); i++){path.emplace_back(candidates[i]);//继续添加其他元素,注意一个元素可以重复添加所以startIndex=ibacktracking(candidates,target - candidates[i],i);//回溯(和path.emplace_back(candidates[i])对应)path.pop_back();}}public:vector<vector<int>> combinationSum(vector<int>& candidates, int target) {//清空ans和path中的数据,防止上次调用存在数据残留ans.clear();path.clear();//递归(回溯)计算组合总和backtracking(candidates,target,0);return ans;}
};int main(int argc, char const *argv[])
{vector<int> candidates={2,3,5};int target=8;//计算组合总和Solution s;vector<vector<int>> ans=s.combinationSum(candidates,target);//输出计算的组合总和for (int i = 0; i < ans.size(); i++){cout<<"[";for (int j = 0; j < ans[i].size(); j++){cout<<ans[i][j];if (j!=ans[i].size()-1){cout<<" ";}}cout<<"]";}return 0;
}
LeetCode 热题 100_组合总和(58_39)原题链接
欢迎大家和我沟通交流(✿◠‿◠)
相关文章:
LeetCode 热题 100_组合总和(58_39_中等_C++)(递归(回溯))
LeetCode 热题 100_组合总和(58_39) 题目描述:输入输出样例:题解:解题思路:思路一(递归(回溯)): 代码实现代码实现(思路一(…...
使用PHP爬虫获取1688商品分类:实战案例指南
在电商领域,商品分类信息是商家进行市场调研、选品分析和竞争情报收集的重要基础。1688作为国内领先的B2B电商平台,提供了丰富且详细的商品分类数据。通过PHP爬虫技术,我们可以高效地获取这些分类信息,为商业决策提供有力支持。 …...
Nginx location 和 proxy_pass 配置详解
概述 Nginx 配置中 location 和 proxy_pass 指令的不同组合方式及其对请求转发路径的影响。 配置效果 1. location 和 proxy_pass 都带斜杠 / location /api/ {proxy_pass http://127.0.0.1:8080/; }访问地址:www.hw.com/api/upload转发地址:http://…...
云创智城充电系统:基于 SpringCloud 的高可用、可扩展架构详解-多租户、多协议兼容、分账与互联互通功能实现
在新能源汽车越来越普及的今天,充电基础设施的管理和运营变得越来越重要。云创智城充电系统,就像一个超级智能管家,为新能源充电带来了全新的解决方案,让充电这件事变得更方便、更高效、更安全。 一、厉害的技术架构,让…...
AIP-143 标准代号
编号143原文链接AIP-143: Standardized codes状态批准创建日期2019-07-24更新日期2019-07-24 许多常见的概念,如语言、国家、货币等,都有用于数据通信和处理的通用代号(通常由国际标准化组织正式定义)。这些代号解决了在书面语言…...
机器视觉--数字图像格式
图像格式 在数字图像的世界里,不同的图像格式有着各自的特点和适用场景。了解这些图像格式,对于我们在处理图像时选择合适的存储和传输方式至关重要。下面就让我们来详细探讨一下常见的几种数字图像格式。 一、BMP 文件(Bitmap)…...
Kotlin 2.1.0 入门教程(十七)接口
接口 接口可以包含抽象方法的声明,也可以包含方法的实现。 接口与抽象类的不同之处在于,接口无法存储状态。接口可以拥有属性,但这些属性要么必须是抽象的,要么就得提供访问器的实现。 接口使用 interface 关键字来定义&#x…...
渗透测试工具:SQLmap安装教程及使用
在渗透测试的世界里,SQL注入攻击无疑是最常见且最具威胁的安全漏洞之一。幸运的是,SQLmap 这个强大的自动化工具,能够帮助我们快速识别和利用这些漏洞。如果你也想了解如何用 SQLmap 进行渗透测试,那么这篇文章就是为你准备的&…...
4.SpringSecurity在分布式环境下的使用
参考 来源于黑马程序员: 手把手教你精通新版SpringSecurity 分布式认证概念说明 分布式认证,即我们常说的单点登录,简称SSO,指的是在多应用系统的项目中,用户只需要登录一次,就可以访 问所有互相信任的应…...
RocketMQ和Kafka如何实现顺序写入和顺序消费?
0 前言 先说明kafka,顺序写入和消费是Kafka的重要特性,但需要正确的配置和使用方式才能保证。本文需要解释清楚Kafka如何通过分区来实现顺序性,以及生产者和消费者应该如何配合。 首先,顺序写入。Kafka的消息是按分区追加写入…...
SQL联合查询
文章目录 MySQL系列:1.内连接2.外连接3.自连接4.子查询5.合并查询6.插入查询 MySQL系列: 初识MySQL,MySQL常用数据类型和表的操作,增删改查(CRUD)操作(总),数据库约束数据库设计 #班级表 drop table if exists class; create ta…...
deepseek:三个月备考高级系统架构师
一、备考总体规划(2025年2月11日 - 2025年5月) 1. 第一阶段:基础夯实(2025年2月11日 - 2025年3月10日) 目标:快速掌握系统架构师考试的核心知识点。 重点内容: 计算机组成原理、操作系统、数据…...
支持向量机原理
支持向量机(简称SVM)虽然诞生只有短短的二十多年,但是自一诞生便由于它良好的分类性能席卷了机器学习领域。如果不考虑集成学习的算法,不考虑特定的训练数据集,尤其在分类任务中表现突出。在分类算法中的表现SVM说是排…...
DeepSeek人工智能AI汽车营销销售培训讲师培训师唐兴通讲课汽车销售大数据存量客户数字化营销数字化销售大模型销售话术引流内容社群私域
唐兴通 数字商业创新实践专家、数字营销与销售顾问 沃顿商学院特邀演讲嘉宾|美国营销协会艾菲奖评委 核心专长: AI商业化应用、数字营销创新、数字新销售能力体系打造、数字化转型、 教学经历:从教20年,执教12所全球顶尖商学院…...
Molecular Communication(分子通信)与 Molecular Semantic Communication(分子语义通信)
1. 引言 随着传统无线通信在极端环境(如微观生物体内、海洋深处)中的局限性凸显,分子通信(Molecular Communication, MC)成为一种新型通信范式。分子通信通过分子作为信息载体,在纳米尺度上传输信息&#…...
Webpack代码分割、分割策略性能优化详解
在前端面试中,Webpack 是一个常见的考察点,特别是关于性能优化、构建配置以及代码分割等方面的问题。以下是 Webpack 常见问题详解,包括 代码分割 相关的内容。 1. Webpack 基础概念 1.1 Webpack 是什么? Webpack 是一个前端构建工具,主要用于将项目中的各种资源(JavaS…...
大脑网络与智力:基于图神经网络的静息态fMRI数据分析方法|文献速递-医学影像人工智能进展
Title 题目 Brain networks and intelligence: A graph neural network based approach toresting state fMRI data 大脑网络与智力:基于图神经网络的静息态fMRI数据分析方法 01 文献速递介绍 智力是一个复杂的构念,包含了多种认知过程。研究人员通…...
ArcGIS Pro显示缓存空间不足导致编辑或加载数据显示不完全
ArcGIS Pro对于显示缓存有32GB的限制,所以当缓存设置中,缓存将达到32GB时,会出现编辑、加载slpk显示不全的情况。 清除计算机上的显示缓存方法 1.启动 ArcGlS Pro。单击左下角的设置,然后单击选项; 2.在选项窗口中&…...
天童美语:观察你的生活
在孩子的认知里,世界宛如一片充满神秘色彩的未知之境,有着无尽的奥秘等待他们去探索。家长们,引导孩子用心观察世界,领略其中的美妙,这对孩子的成长进程有着极为关键的作用。贵阳天童教育相信:观察生活&…...
网络通信的基石:深入理解 TCP/IP 协议栈与 TCP/UDP 协议
博文题目:网络通信的基石:深入理解 TCP/IP 协议栈与 TCP/UDP 协议 引言 在当今数字化世界中,网络已经渗透到我们生活的方方面面。从浏览网页、收发邮件,到在线视频、远程会议,所有这些便捷的网络应用都离不开一个至关重要的基础设施——TCP/IP 协议栈。它就像是互联网的…...
OpenSpeedy终极指南:5分钟掌握免费开源游戏变速技巧
OpenSpeedy终极指南:5分钟掌握免费开源游戏变速技巧 【免费下载链接】OpenSpeedy 🎮 An open-source game speed modifier. 项目地址: https://gitcode.com/gh_mirrors/op/OpenSpeedy OpenSpeedy是一款专为Windows玩家设计的免费开源游戏加速工具…...
高阶意识与预测处理理论:AI意识计算的技术实现与评估
1. 意识计算理论:从哲学思辨到工程实现的范式转移在认知科学与人工智能的交汇处,有一个问题长久以来既令人着迷又充满挑战:我们能否在机器中构建意识?这听起来像是科幻小说的主题,但过去二十年间,一系列基于…...
别再手动拼接错误信息了!用CONVERT_BDCMSGCOLL_TO_BAPIRET2一键搞定SAP BDC消息处理
别再手动拼接错误信息了!用CONVERT_BDCMSGCOLL_TO_BAPIRET2一键搞定SAP BDC消息处理 在SAP ABAP开发中,BDC(Batch Data Communication)是批量数据导入和事务录屏的核心技术。然而,每次调用BDC后返回的消息处理却让开发…...
高德地图SDK避坑指南:离线地图下载失败的5个常见原因及解决方法
高德地图SDK避坑指南:离线地图下载失败的5个常见原因及解决方法 在移动应用开发中,离线地图功能对于需要在地理位置偏远或网络不稳定环境下运行的应用至关重要。高德地图SDK作为国内领先的地图服务提供商,其离线地图功能被广泛应用于各类Andr…...
从代码生成到自主学习:构建AI编程智能体的核心架构与实践
1. 项目概述:一个学习编码的智能体最近在GitHub上看到一个挺有意思的项目,叫sanbuphy/learn-coding-agent。光看名字,你可能会觉得这又是一个“教你编程”的AI工具,市面上这类产品已经多如牛毛了。但当我深入探究其代码和设计理念…...
CANN / cann-learning-hub: Ascend C 算子工程化开发指南
【免费下载链接】cann-learning-hub CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。 项目地址: https://gitcode.com/cann/cann-learning-hub name: ascendc-ops-project desc…...
考试复习录音整理太慢还听不清不会整理?可参考这套标准化整理流程
你是不是也碰到考试复习录音整理慢到崩溃,听不清口音、杂音反复拖进度条,半天出不了一篇能用的稿子?做学术要整理访谈讲座录音,一天大半时间耗在重复转写上?我踩过无数坑磨出来这套标准化整理流程,看完就能…...
CANN PTO自动模式总览
auto模式总览 【免费下载链接】pto-isa Parallel Tile Operation (PTO) is a virtual instruction set architecture designed by Ascend CANN, focusing on tile-level operations. This repository offers high-performance, cross-platform tile operations across Ascend p…...
别再只盯着告警了:从Pikachu靶场搭建看SRE可观测性的实战落地(含日志与调用链配置)
从Pikachu靶场搭建看SRE可观测性的实战落地 当我们在本地搭建一个Web漏洞练习平台时,往往只关注漏洞利用本身,却忽略了服务运行时的状态感知。最近在配置Pikachu靶场时,我尝试将SRE的可观测性理念应用到这个微型PHP服务中,意外发现…...
移动端AI推理框架PocketPaw:架构解析与实战部署指南
1. 项目概述:一个为移动端优化的AI模型推理框架最近在移动端AI应用开发圈子里,一个名为PocketPaw的项目开始引起不少开发者的注意。简单来说,PocketPaw是一个专门为移动设备(尤其是Android和iOS)优化的轻量级AI模型推理…...
