当前位置: 首页 > news >正文

力扣第39题 组合总和 c++ 回溯剪枝题

题目

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. 首先定义了两个向量resultpath,用于存储最终的结果集合以及临时的组合方案。其中,result用来存储所有符合条件的组合方案,path则用来存储当前正在尝试的组合方案。
  2. 接着是核心的回溯函数backtracking。其参数包括候选数字集合candidates,目标值target,当前的数字和sum以及正在搜索的起始位置startIndex。在函数中,我们首先进行递归终止条件的判断:如果当前的数字和已经大于目标值,则说明当前的组合不可能满足条件,直接返回;如果当前的数字和等于目标值,则说明找到了一组符合条件的组合,将其加入结果集合中,并返回。
  3. 接着,我们从给定的起始位置startIndex开始枚举候选数字,尝试将它们加入当前的组合中。由于每个数字可以重复使用,所以我们并不是从下一个数字开始递归搜索,而是从当前数字继续搜索。在加入数字后,我们进行一次递归搜索,接着弹出最近加入的数字,尝试下一个数字,直到搜索完所有的数字。
  4. 最后,在主函数中,我们清空了结果向量result和临时变量path,然后调用backtracking函数从第一个数字开始搜索,直到找到所有可能的组合方案。

复杂度

        时间复杂度:

                O(2^n)

时间复杂度:

  • 回溯算法的时间复杂度通常是指数级别的,它取决于候选数字集合的大小以及目标值的大小。假设候选数字集合的长度为n,目标值为target,则最坏情况下,需要遍历所有可能的组合,时间复杂度为O(2^n)。

        空间复杂度

                O(m*n + n)

空间复杂度:

  • 这段代码的空间复杂度主要是由结果向量result和临时变量path所占用的空间来决定。结果向量result存储了所有符合条件的组合方案,所以它的空间复杂度为O(m * n),其中m是结果集合的大小,n是每个组合的平均长度。临时变量path在递归过程中被使用,它的空间复杂度为O(n),其中n是候选数字集合的长度。因此,总体的空间复杂度为O(m * n + n)。

c++ 代码

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); // 继续递归搜索下一个数字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); // 初始和为0,从第一个数字开始搜索return result;}
};

c++优化的代码 剪枝

在每次递归调用backtracking函数之前,会判断当前和sum加上候选数字candidates[i]是否大于目标值target。如果大于目标值,就可以终止遍历,因为再往后添加数字只会使得和更大,不可能等于目标值了。这样可以减少无效的搜索操作,提高算法的效率。

具体来说,这个优化部分体现在以下代码片段中:

通过这个优化,可以避免对那些不可能达到目标值的路径进行搜索,从而减少了不必要的操作,提高了算法的效率。

需要注意的是,在应用剪枝优化策略的场景中,候选数字必须是有序的。因此,在调用backtracking函数之前,代码使用了sort(candidates.begin(), candidates.end())对候选数字进行排序,为了保证剪枝的正确性。

class Solution {
private:vector<vector<int>> result; // 存储最终结果vector<int> path; // 存储临时组合方案// 回溯函数void backtracking(vector<int>& candidates, int target, int sum, int startIndex) {if (sum == target) { // 当前和等于目标值,找到一组符合条件的组合result.push_back(path);return;}for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; i++) {// 如果当前和加上当前数字已经大于目标值,则终止遍历sum += candidates[i]; // 加入当前数字path.push_back(candidates[i]); // 将当前数字加入临时组合方案backtracking(candidates, target, sum, i); // 继续向后搜索,从当前数字开始sum -= candidates[i]; // 回溯,撤销当前数字path.pop_back(); // 回溯,撤销当前数字的选择}}public:vector<vector<int>> combinationSum(vector<int>& candidates, int target) {result.clear(); // 清空结果path.clear(); // 清空临时组合方案sort(candidates.begin(), candidates.end()); // 需要对候选数字进行排序,为了剪枝准备backtracking(candidates, target, 0, 0); // 从第一个数字开始回溯搜索return result; // 返回结果集合}
};

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

相关文章:

力扣第39题 组合总和 c++ 回溯剪枝题

题目 39. 组合总和 中等 相关标签 数组 回溯 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 cand…...

qt软件正常运行的崩溃了定位行号方法

软件&#xff08;debug版exe或者release版exe&#xff09;在正常运行状态下&#xff08;不是gdb调试运行&#xff09;&#xff0c;如果软件崩掉&#xff0c;那么会直接闪退&#xff0c;软件什么也做不了&#xff0c;此时无法保存软件中的状态信息&#xff0c;此外&#xff0c;也…...

软件工程与计算总结(十五)详细设计中面向对象方法下的信息隐藏

软件工程与计算总结&#xff08;十三&#xff09;详细设计中的模块化与信息隐藏 之前的博客中&#xff0c;模块需要隐藏的决策主要由“职责的实现”and“实现的变更”两类&#xff0c;在面向对象方法中&#xff0c;需要做到的就是&#xff1a; 封装类的职责&#xff0c;隐藏职…...

鸿蒙初体验

下载与安装DevEco Studio 在HarmonyOS应用开发学习之前&#xff0c;需要进行一些准备工作&#xff0c;首先需要完成开发工具DevEco Studio的下载与安装以及环境配置。 进入DevEco Studio下载官网&#xff0c;单击“立即下载”进入下载页面。 DevEco Studio提供了Windows版本和…...

hive复合类型的数据查询

hive数据表创建-CSDN博客 --第一个名字以M开头的 访问数组array 数组&#xff08; array) 引用方式 列名 [ 元素索引 _ 以 0 开始 ] select * from emp where emp_name[0] rlike "^M"; -- 出生日期是在 5 几年 访问 Map map 引用方式 列名 ["Key"] selec…...

Notes/Domino 14 Early Access Drop3发布

大家好&#xff0c;才是真的好。 其实上周&#xff0c;就是国庆假期的时候&#xff0c;HCL Notes/Domino 14 Early Access Drop3&#xff08;以下简称EA3&#xff09;就已经发布&#xff0c;而且和传说中的一样&#xff0c;带来了数项惊人的新特性。 我们先讲讲这一版本新特性…...

前端、后端开发者常用到的免费API整理

以下是我整理的前端、后端工程师在开发中经常使用到的API接口&#xff0c;希望能帮到大家~ 手机号码归属地&#xff1a;可根据手机号码查询其省市区、运营商区号行政区划代码等信息。 上亿条数据囊括最新的170、166、147等号段&#xff0c;更新及时、准确度高。空号检测&#…...

【LeetCode高频SQL50题-基础版】打卡第9天:第46~50题

文章目录 【LeetCode高频SQL50题-基础版】打卡第9天&#xff1a;第46~50题⛅前言患某种疾病的患者&#x1f512;题目&#x1f511;题解 第二高的薪水&#x1f512;题目&#x1f511;题解 按日期分组销售产品&#x1f512;题目&#x1f511;题解 列出指定时间段内所有的下单产品…...

中断机制-通过volatile实现线程中断停止

4.1.4 大厂面试题中断机制考点 如何停止中断运行中的线程&#xff1f; 通过一个volatile变量实现 package com.nanjing.gulimall.zhouyimo.test;import java.util.concurrent.TimeUnit;/*** author zhou* version 1.0* date 2023/10/15 2:34 下午*/ public class InterruptD…...

Elasticsearch 8.11 中的合并更少,摄取更快

作者&#xff1a;ADRIEN GRAND Elasticsearch 8.11 改进了管理索引缓存的方式&#xff0c;从而减少了段合并。 我们对 Elasticsearch 8.11 从索引缓存回收内存的方式进行了重大更改&#xff0c;这有助于减少合并开销&#xff0c;从而加快索引速度。 使用我们的日志跟踪&#x…...

算法村开篇

大家好我是苏麟从今天开始我将带来算法的一些习题和心得体会等等...... 算法村介绍 我们一步步地学习算法本专栏会以闯关的方式来学习算法 循序渐进地系统的学习算法并掌握大部分面试知识 , 期待和大家一起进步 . 索大祝大家学有所成 , 前程似锦....

Leetcode—136.只出现一次的数字【简单】

2023每日刷题&#xff08;二&#xff09; Leetcode—136.只出现一次的数字 位运算法 实现代码 int singleNumber(int* nums, int numsSize){int i 0;int res 0;for(; i < numsSize; i) {res ^ nums[i];}return res; }运行结果 之后我会持续更新&#xff0c;如果喜欢我的…...

关于RNNoise、webrtc_ns、三角带通滤波器、对数能量

语音特征参数MFCC提取过程详解 其中讲解了&#xff1a;三角带通滤波器 、计算每个滤波器组输出的对数能量、对数能量、经离散余弦变换&#xff08;DCT&#xff09;得到MFCC系数 推荐阅读某乎这位大佬的全部文章&#xff1a; 下面是几篇出自这位大佬的很好的文章&#xff1a; …...

c语言练习89:链表的使用

链表的使用 虽然有这么多的链表的结构&#xff0c;但是我们实际中最常⽤还是两种结构&#xff1a; 单链表 和 双向带头循环链表 1. ⽆头单向⾮循环链表&#xff1a;结构简单&#xff0c;⼀般不会单独⽤来存数据。实际中更多是作为其他数据结 构的⼦结构&#xff0c;如哈希桶、…...

ArkTS及openHarmony

补充 padding&#xff1a;内边距&#xff0c;也就是盒子边和盒子内部的距离 margin&#xff1a;外边距&#xff0c;也就是盒子和盒子的距离 openHarmony应用开发及UI界面 常用布局 Row 水平线性布局核心代码 子控件会共享同一行&#xff0c;也就是都在同一行内 Preview C…...

Idea怎么配置Maven才能优先从本地仓库获取依赖

网上的方法 : 在设置中搜索 Runner ,在VM Option中设置参数 -DarchetypeCataloginternal删除 解压后的依赖包中的 _remote.repositories m2e-lastUpdated.properties *.lastUpdated 文件。 上边都没有效果 最终的解决方法&#xff0c;修改maven配置文件settings.xml 主要两个…...

聊聊HttpClient的DnsResolver

序 本文主要研究一下HttpClient的DnsResolver DnsResolver org/apache/http/conn/DnsResolver.java /*** Users may implement this interface to override the normal DNS lookup offered* by the OS.** since 4.2*/ public interface DnsResolver {/*** Returns the IP a…...

剑指智能驾驶,智己LS6胜算几何?

监制 | 何玺 排版 | 叶媛 10月12日&#xff0c;IM智己旗下的新车智己LS6宣布上市。 新车型搭载尖端科技多项&#xff0c;其中以“全画幅数字驾舱屏”、和城市高阶智能辅助驾驶为核心的智驾技术&#xff0c;更是引来众多用户关注。 01 新能源新卷王智己LS6 智己LS6一发布就…...

网络工程师知识点5

71、什么是FTP&#xff1f; FTP是文件传输协议。 FTP传输数据时支持两种传输模式&#xff1a;ASCII模式和二进制模式。 需要TCP的21号端口来建立控制连接 需要TCP的20号端口来建立数据连接 72、什么是telnet&#xff1f; Telnet提供了一个交互式操作界面&#xff0c;允许终端远…...

未来展望:大型语言模型与 SQL 数据库集成的前景与挑战

一、前言 随着 GPT-3、PaLM 和 Anthropic 的 Claude 等大型语言模型 (LLM) 的出现引发了自然语言在人工智能领域的一场革命。这些模型可以理解复杂的语言、推理概念并生成连贯的文本。这使得各种应用程序都能够使用对话界面。然而&#xff0c;绝大多数企业数据都存储在结构化 …...

提示工程延迟优化的终极技巧:这6个方法,让你无延迟

提示工程延迟优化终极指南&#xff1a;6个技巧让你的AI响应“飞”起来 1. 标题选项 《提示工程延迟优化终极指南&#xff1a;6个技巧让你的AI响应“飞”起来》《告别等待&#xff01;提示工程延迟优化的6个关键方法》《AI响应慢&#xff1f;这6个提示工程技巧帮你解决延迟痛点》…...

StructBERT中文相似度模型企业应用指南:对接CRM、知识库、智能客服系统的完整集成方案

StructBERT中文相似度模型企业应用指南&#xff1a;对接CRM、知识库、智能客服系统的完整集成方案 1. 企业级文本相似度应用概述 在当今企业数字化运营中&#xff0c;文本相似度计算技术正成为提升业务效率的关键工具。StructBERT中文相似度模型基于百度先进的大模型技术&…...

效率提升50%:OpenClaw+GLM-4.7-Flash的会议纪要自动化

效率提升50%&#xff1a;OpenClawGLM-4.7-Flash的会议纪要自动化 1. 为什么需要自动化会议纪要 作为技术团队负责人&#xff0c;我每周要参加至少8场会议。过去两年里&#xff0c;我尝试过各种会议纪要工具——从讯飞听见的语音转写&#xff0c;到Notion AI的摘要生成&#x…...

虚幻引擎+数字孪生:手把手搭建智慧校园三维可视化平台(附浙江工商大学实战案例)

虚幻引擎数字孪生&#xff1a;从零构建智慧校园三维可视化平台的完整指南 想象一下&#xff0c;清晨走进校园时&#xff0c;管理员已经在三维可视化平台上完成了安防巡查&#xff1b;教务主任通过热力图调整着今天的课程安排&#xff1b;后勤人员正根据实时数据优化能源分配——…...

206_深度学习进阶:模型选择、过拟合与欠拟合的生存法则

在机器学习中&#xff0c;我们的目标是发现泛化&#xff08;Generalization&#xff09;模式&#xff0c;即在未见过的数据上也能预测准确。然而&#xff0c;模型往往会陷入两个极端&#xff1a;要么学得太浅&#xff08;欠拟合&#xff09;&#xff0c;要么记住了噪音&#xf…...

Fun-ASR参数配置攻略:热词列表、目标语言,这样设置准确率最高

Fun-ASR参数配置攻略&#xff1a;热词列表、目标语言&#xff0c;这样设置准确率最高 1. 为什么参数配置如此重要&#xff1f; 语音识别系统的准确率往往取决于两个关键因素&#xff1a;模型本身的性能和使用者的参数配置。Fun-ASR作为钉钉与通义实验室联合推出的企业级语音识别…...

从光波“数环”到材料“测温”:迈克尔逊干涉仪在热膨胀系数测量中的创新实践

1. 光波如何变成材料"温度计"&#xff1f; 第一次接触迈克尔逊干涉仪时&#xff0c;我盯着那些不断变化的彩色圆环发了半天呆。谁能想到这些看似简单的光环&#xff0c;竟然能精确测量出金属棒受热后百万分之一米级别的长度变化&#xff1f;这就像用一把能测量头发丝…...

本地部署开源直播视频平台 Owncast 并实现外部访问

Owncast 是一款开源的、自托管的直播和视频平台&#xff0c;它允许用户完全掌控自己的直播基础设施、数据和观众互动&#xff0c;避免依赖 Twitch 、YouTube 等大型中心化平台&#xff0c;为内容创作者提供一个独立、去中心化的直播解决方案。本文将详细介绍如何利用 Docker 在…...

3大维度解析BGE向量技术:从原理到检索增强实践

3大维度解析BGE向量技术&#xff1a;从原理到检索增强实践 【免费下载链接】FlagEmbedding Dense Retrieval and Retrieval-augmented LLMs 项目地址: https://gitcode.com/GitHub_Trending/fl/FlagEmbedding 文本嵌入技术是现代AI系统的核心组件&#xff0c;而检索增强…...

如何用OB_Template构建你的终极读书笔记系统:Obsidian新手完全指南

如何用OB_Template构建你的终极读书笔记系统&#xff1a;Obsidian新手完全指南 【免费下载链接】OB_Template OB_Templates is a Obsidian reference for note templates focused on new users of the application using only core plugins. 项目地址: https://gitcode.com/g…...