LeetCode 0039.组合总和:回溯 + 剪枝

【LetMeFly】39.组合总和:回溯 + 剪枝

力扣题目链接:https://leetcode.cn/problems/combination-sum/

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

解题方法:回溯 + 剪枝

写一个函数dfs(target, index),用来处理距离目标还剩target,处理过候选数组的[0, index)的情况。

为了实现这个函数,我们还需要两个“全局”变量(或者通过参数传递):ans用来存放所有可行的情况(答案)、now用来存放当前已选元素。

函数dfs终止条件:

  • target为0:now为一种可选方案,now加入ans数组并终止递归
  • index超出候选数组的下标范围:递归终止

函数dfs要做的事:

  1. 在已选方案now的基础上,不选当前元素candidates[index]:递归dfs(target, index + 1)
  2. 在已选方案now的基础上,选择当前元素candidates[index]:将candidates[index]加入now数组,递归dfs(target - candidates[index], index),(回溯)将candidates[index]now数组中剔除

剪枝方案:target - candidates[index] >= 0时再递归回溯。

  • 时间复杂度 O ( S i z e ( a n s ) ) O(Size(ans)) O(Size(ans))
  • 空间复杂度 O ( t a r g e t ) O(target) O(target):空间复杂度为递归深度,最坏情况下全是1要递归target

AC代码

C++
class Solution {
private:vector<vector<int>> ans;vector<int> now;void dfs(vector<int>& candidates, int target, int index) {if (!target) {ans.push_back(now);return;}if (index == candidates.size()) {return;}// not choosedfs(candidates, target, index + 1);// chooseif (target - candidates[index] >= 0) {now.push_back(candidates[index]);dfs(candidates, target - candidates[index], index);  // 这里不能是index + 1,因为可以重复选择now.pop_back();}}
public:vector<vector<int>> combinationSum(vector<int>& candidates, int target) {dfs(candidates, target, 0);return ans;}
};
Python
# from typing import Listclass Solution:def dfs(self, target: int, index: int) -> None:if not target:self.ans.append(self.now[:])returnif index == len(self.candidates):return# not chooseself.dfs(target, index + 1)# chooseif target >= self.candidates[index]:self.now.append(self.candidates[index])self.dfs(target - self.candidates[index], index)self.now.pop()        def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:self.ans = []self.now = []self.candidates = candidatesself.dfs(target, 0)return self.ans

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/137994260

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

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

相关文章

[NSSCTF]prize_p5

前言 之前就学过反序列化的字符串逃逸 但是没怎么做题 补一下窟窿 题目 <?phperror_reporting(0);class catalogue{public $class;public $data;public function __construct(){$this->class "error";$this->data "hacker";}public functi…

Ali-Sentinel-链路控制

归档 GitHub: Ali-Sentinel-链路控制 链结构 参考&#xff1a;入口控制-处理链 具体实现 NodeSelectorSlot 给上下文设置统计节点 com.alibaba.csp.sentinel.slots.nodeselector.NodeSelectorSlot Spi(isSingleton false, order Constants.ORDER_NODE_SELECTOR_SLOT)…

2023-2024年度广东省职业院校学生技能大赛“ 网络系统管理”赛项竞赛规程(正式稿)

2023-2024年度广东省职业院校学生技能大赛“ 网络系统管理”赛项竞赛规程&#xff08;正式稿&#xff09; 信息安全管理与评估 网络系统管理 网络搭建与应用 云计算 软件测试 移动应用开发 任务书&#xff0c;赛题&#xff0c;解析等资料&#xff0c;知识点培训服务 添加博主wx…

Python 中的下划线变量

Python 中的下划线变量 _name: 这是一种约定俗成的方式&#xff0c;表示这是一个私有变量&#xff0c;意味着它应该在类的内部使用&#xff0c;而不应该直接从外部访问。但实际上&#xff0c;Python并没有严格的私有化机制&#xff0c;这只是一种约定&#xff0c;因为外部仍然可…

Nginx高级配置与重写规则详解:从入门到实践

摘要: 本文将深入探讨Nginx的高级配置与重写规则,通过实际案例讲解如何优化Nginx的配置,实现URL重写、负载均衡、缓存优化等功能。文章旨在帮助读者更好地理解和应用Nginx,提升网站性能和用户体验。 一、Nginx简介 Nginx是一款高性能的HTTP和反向代理服务器,也是IMAP/POP…

代码随想录训练营day43

第九章 动态规划 part05 1.LeetCode. 最后一块石头的重量 II 1.1题目链接&#xff1a;1049.最后一块石头的重量II 文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;B站卡哥视频 1.2思路&#xff1a;本题其实就是尽量让石头分成重量相同的两堆&#xff0c;相撞之后剩下…

【嵌入式DIY实例】-RFID门禁系统

DIY RFID门禁系统 文章目录 DIY RFID门禁系统1、RFID RC522介绍2、硬件准备与接线2、代码实现RFID(Radio Frequency Identification)简称为射频识别。 在本文中,将演示如何使用这项技术来实现门安全系统。 1、RFID RC522介绍 RFID rc522是一种基于射频的模块,其感应范围接…

Java中的多线程编程与并发控制

Java中的多线程编程与并发控制 一、引言 随着计算机硬件技术的不断发展&#xff0c;多核处理器已经成为现代计算机系统的标配。在这样的背景下&#xff0c;多线程编程与并发控制成为了Java开发中不可或缺的一部分。多线程编程能够充分利用多核处理器的并行计算能力&#xff0…

嵌入式软件工程师要会画板子吗?

答案:要 作为嵌入式软件工程师,本来就经常和硬件打交道。调试各种协议也要看波形,用示波器什么的。软件玩多了也会腻,可以玩玩硬件,自己从 0 做出一个东西的感觉是不一样的。职业生涯那么长,多尝试一些总是好的,一个软硬件都懂的人,才能更好的带项目。 博主玩过很多板…

个人学习-前端相关(1):ECMAScript 6-变量、模板字符串、解构表达式

前言 由于最近公司有接到一些小程序或者app相关的内容&#xff0c;可能考虑要做一些样例供参考。虽然在20年短暂学习和使用过vue2&#xff0c;但由于时间久远且技术发展太快&#xff0c;需要对一些旧知识进行巩固&#xff0c;新的内容进行学习。 ECMAScript 6简介 ECMAScrip…

设置Linux开发板开机自启动QT程序的报错解决办法

设置Linux开发板开机自启动QT程序报错解决办法 设置开发板开机自启动QT 打开 /etc/init.d/rsC 文件&#xff0c;添加以下内容 cd / ./my_start_run.shmy_start_run.sh 是自己编写的自启动脚本&#xff0c;内容例如下&#xff1a;(也可以将这些直接写到 /etc/init.d/rsC 文件…

C#算法之归并排序

算法释义&#xff1a;归并排序是一种分治算法&#xff0c;它采用分而治之的策略&#xff0c;将待排序的数组分成更小的部分&#xff0c;递归地对这些部分进行排序&#xff0c;然后将排序好的部分合并起来。它是一种比较稳定的排序算法。排序过程总结如下&#xff1a; 1、分解&a…

请编写一个函数void fun(char *tt,int pp[]),统计在tt字符串中“a”到“z”26个字母各自出现的次数,并依次放在pp所指数组中。

本文收录于专栏:算法之翼 https://blog.csdn.net/weixin_52908342/category_10943144.html 订阅后本专栏全部文章可见。 本文含有题目的题干、解题思路、解题思路、解题代码、代码解析。本文分别包含C语言、C++、Java、Python四种语言的解法和详细的解析。 题干 请编写一个函…

Python基础11-字符串处理

连接字符串 要将字符串连接在一起&#xff1a; greeting "Hello" name "Alice" message greeting ", " name "!" print(message)使用 str.format 进行字符串格式化 要将值插入字符串模板&#xff1a; message "{}, {}…

快来把wordpress图片放到免费的cloudflare R2上去

网站一直是用的wordpress&#xff0c;做了几年uploads下的图片已经大到了几十GB单位&#xff0c;VPS也一路升级&#xff0c;吃不消啊吃不消。 一直在想有什么办法能解决下这一大堆图片&#xff0c;网站逛了一圈发现cloudflare的R2有10G免费空间&#xff0c;而且本来就用的他家的…

Day17.一刷数据结构算法(C语言版) 654最大二叉树;617合并二叉树;700二叉搜索树中的搜索;98验证二叉搜索树

又是破防的一天...... 一.654最大二叉树 又是构造二叉树&#xff0c;昨天大家刚刚做完 中序后序确定二叉树&#xff0c;今天做这个 应该会容易一些&#xff0c; 先看视频&#xff0c;好好体会一下 为什么构造二叉树都是 前序遍历 题目链接&#xff1a;最大二叉树 文章讲解&…

Django框架之原始web框架优化

一、web应用框架简介及手撸web框架 软件开发架构详细&#xff1a;网络编程之网络架构及其趋势 - Xiao0101 - 博客园 (cnblogs.com) 软件开发架构分为两种&#xff1a; c/s架构&#xff1a;客户端软件(client)—服务端软件(server)b/s架构 &#xff1a;浏览器(Browser)------…

电子负载仪的远端控制

前言 最近研究了电子负载仪的远端控制&#xff08;区别于前面板控制&#xff09;&#xff0c;主要是用于程序控制&#xff0c;避免繁琐复杂的人工控制&#xff0c;举了南京嘉拓和艾维泰科的例子。 有纰漏请指出&#xff0c;转载请说明。 学习交流请发邮件 1280253714qq.com …

今日arXiv最热大模型论文:大模型也来看球,还能判断是否犯规

在足球世界&#xff0c;裁判的哨声可谓“千金难买”&#xff0c;因为它能直接决定俱乐部的钱包是鼓是瘪。但球场变化莫测&#xff0c;非常考验裁判的水平。 2022年卡塔尔世界杯上&#xff0c;半自动越位识别技术&#xff08;SAOT&#xff09;闪亮登场&#xff0c;通过12台摄像…

APP推广防作弊策略

背景 为保障下载、使用数量&#xff0c;APP厂商通常会投巨资给第三方渠道&#xff0c;用以推广宣传吸纳更多用户。在这一过程中&#xff0c;见有利可图的内鬼、羊毛党、刷量中介等则会趁势而入&#xff0c;成为刷量推广数据造假的中坚。据一本财经报道称&#xff0c;过千万流量…