【代码随想录】回溯问题之组合

前言

更详细的在大佬的代码随想录 (programmercarl.com)

本系列仅是简洁版笔记,为了之后方便观看

解决的类型问题

组合无序,排列有序

  1. 组合
  2. 切割
  3. 子集
  4. 排列(强调元素的顺序)
  5. 棋牌问题(n皇后,数独)

回溯法的三个步骤 

  1. 递归函数参数/返回值
  2.  终止条件
  3. 单层递归逻辑

去重词汇 

  1. 树层去重
  2. 树枝去重

模版

void backtracking(参数) {if (终止条件) {存放结果;return;}for (遍历结点) {处理节点;backtracking(路径,选择列表); // 递归回溯,撤销处理结果}
}

组合

 77. 组合 - 力扣(LeetCode)

class Solution {private:vector<vector<int>> result;vector<int>path;void backtracking(int n,int k,int a)//a表示递归的层数{if(path.size()==k){result.push_back(path);return;}for(int i=a;i<=n;i++){path.push_back(i); backtracking(n, k, i + 1); path.pop_back(); }}
public:vector<vector<int>> combine(int n, int k) {backtracking(n,k,1);return result;}
};

 剪枝思路:从for循环开始的起始位置之后选择的元素个数不足需要的元素个数时,无需继续搜索

for (int i = a; i <= n - (k - path.size()) + 1; i++)

组合总和III

 和上一题整体模版是一样的,主要是多了sum的处理和sum的回溯 

216. 组合总和 III - 力扣(LeetCode)

class Solution {
private:vector<vector<int>>result;vector<int>path;void backtracking(int target,int k,int sum,int startIndex){if(sum>target){return;}if(path.size()==k){if(sum==target)result.push_back(path);return ;}for(int i=startIndex;i<=9-(k-path.size())+1;i++){sum += i; // 处理path.push_back(i); // 处理backtracking(target, k, sum, i + 1); // 注意i+1调整startIndexsum -= i; // 回溯path.pop_back(); // 回溯}}
public:vector<vector<int>> combinationSum3(int k, int n) {result.clear(); // 可以不加path.clear();   // 可以不加backtracking(n, k, 0, 1);return result;}
};

电话号码的字母组合

17. 电话号码的字母组合 - 力扣(LeetCode)

1.用二维数组来做一个映射

2.对比发现隐藏的回溯

for (int i = 0; i < letters.size(); i++) {s.push_back(letters[i]);            backtracking(digits, index + 1);    s.pop_back();                      }
for (int i = 0; i < letters.size(); i++) {getCombinations(digits, index + 1, s + letters[i]);  
// void getCombinations(const string& digits, int index, const string& s)}

第二个是进入到下一层计算了,但是s没有变化,所以就相当于回溯了

class Solution {
private:const string letterMap[10]={//逐个映射"", // 0"", // 1"abc", // 2"def", // 3"ghi", // 4"jkl", // 5"mno", // 6"pqrs", // 7"tuv", // 8"wxyz"//9};
public:vector<string>result;string s;void backtracking(const string&digits,int index){if (index == digits.size()) {result.push_back(s);return;}int digit=digits[index] - '0';//依次遍历数字string letters = letterMap[digit]; //寻找该位置对应的字符串     for (int i = 0; i < letters.size(); i++) {s.push_back(letters[i]);            backtracking(digits, index + 1);    s.pop_back();                       }}vector<string> letterCombinations(string digits) {s.clear();result.clear();if (digits.size() == 0) {return result;}backtracking(digits, 0);return result;}
};

组合总和

39. 组合总和 - 力扣(LeetCode)

1.和之前的组合总和最大的差别就是已经选取过的元素还可以再选取 

2.startIndex的作用是:每一次遍历开始的位置,使求出来的组合没有重复元素,例如组合23和组合32

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);//这儿不用i+1的原因是因为可以重复使用某个数字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;}
};

 组合总和II

原数组有重复元素但结果不能有重复的组合(进行去重操作)

40. 组合总和 II - 力扣(LeetCode)

1.排序的原因:把相邻元素放在一起

2.本题去重关键:

树层去重,如果该层已经取过1了,那么它的同一层就不需要再取了,因为前面的1已经包含了1的所有组合(目的:没有重复的元素组合)

原数组有重复元素

树枝去重是没有必要的,因为一条链上本来就可以取得组合中的所有元素,也包括重复的元素(比如果该集合中有两个1,就可以同时取两个1)

3.相比上一题就是多了个used数组来记录该元素是否被使用过

4.used[i - 1] == false 表示,在同一树层上取的 candidates[i] 是从 candidates[i - 1] 回溯而来的,如果 used[i - 1] == true,就说明是进入下一层递归,去下一个数,就进行树枝上的深入

used[i - 1] == true,说明同一树枝candidates[i - 1]使用过(说明同一条链被用过)
used[i - 1] == false,说明同一树层candidates[i - 1]使用过

5.重点回溯代码

if (i > 0 && candidates[i] == candidates[i - 1] && used[i - 1] == false) {continue;}

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

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

相关文章

jsbsim 调 pid 记录

1.先调俯仰角 pitch 俯仰角不能超过 xml 文件里定义的爬升角 高度不对&#xff0c;调 pitch 角的 pid&#xff0c;俯仰角 理论上调pid&#xff1a; 响应快了&#xff0c;P调小&#xff1b;响应慢了&#xff0c;P调大 I消除稳态误差&#xff0c;I调大 D防止震荡&#xff0c;震…

AWS Lambda 第一个例子Hello (JAVA)

什么是Serverless&#xff08;无服务器计算&#xff09; 行业通常所说的Serverless&#xff0c;主要是指“无服务器计算&#xff08;Serverless Computing&#xff09;”。无服务器计算&#xff0c;并不是真的不需要服务器&#xff0c;而是说&#xff0c;对于用户&#xff0c;…

Hadoop3:HDFS的Shell操作(常用命令汇总)

一、简介 什么是HDFS的Shell操作&#xff1f; 很简单&#xff0c;就是在Linux的终端&#xff0c;通过命令来操作HDFS。 如果&#xff0c;你们学习过git、docker、k8s&#xff0c;应该会发现&#xff0c;这些命令的特点和shell命令非常相似 二、常用命令 1、准备工作相关命令…

2024年5月发布的SparkyLinux 8使用的是Debian 13 trixie 的更新源

2024年5月发布的SparkyLinux 8使用的是Debian 13 trixie 的更新源&#xff0c;然后我改了清华对应的更新源&#xff0c;更新成功。纯粹是测试&#xff0c;具体应以官网信息为主。

Elasticsearch 索引、类型、文档、分片与副本等核心概念介绍

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《洞察之眼&#xff1a;ELK监控与可视化》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Elasticsearch简介 2、分布式搜索引擎的工作原理…

AlphaFold3(AF3)简单介绍:预测各种生物分子结构和它们之间相互作用的深度学习模型

参考: 文章地址: https://www.nature.com/articles/s41586-024-07487-w https://blog.google/technology/ai/google-deepmind-isomorphic-alphafold-3-ai-model/ AlphaFold3体验官网: https://golgi.sandbox.google.com/ 《Accurate structure prediction of biomolecula…

xxe漏洞漏洞详解

XXE漏洞概念 XXE(XML External Entity Injection) XML外部实体注入。 重点&#xff1a; XML 外部实体 注入 这三部分搞清楚 XML是一种类似于HTML&#xff08;超文本标记语言&#xff09;的可扩展标记语言&#xff0c;是用于标记电子文件使其具有结构性 的标记语言&#xff0c;可…

Github 2024-05-10 Java开源项目日报Top10

根据Github Trendings的统计,今日(2024-05-10统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目10C++项目2JavaGuide - Java 程序员学习和面试指南 创建周期:2118 天开发语言:Java协议类型:Apache License 2.0Star数量:140773 个…

队列和二叉树

本文主要探讨队列和二叉树的相关知识。 队列 队列结构:队头指针指向队头元素,队尾指针指向队尾元素(链表形式或数组形式) 队列特特点:先进先出,对头插入&#xff0c;队尾出队 双端队列:对头队尾都可插入和出队 二叉树 二叉树:包含根节点和子节点,一个三角组内…

CSS基础(CSS导入方式、选择器、属性)

层叠样式表&#xff08;Cascading Style Sheets&#xff0c;缩写为 CSS&#xff09;是一种样式表语言&#xff0c;用来描述 HTML 或 XML&#xff08;包括如 SVG、MathML 或 XHTML 之类的 XML 分支语言&#xff09;文档的呈现方式。CSS 描述了在屏幕、纸质、音频等其他媒体上的元…

《Decoupled Optimisation for Long-Tailed Visual Recognition》阅读笔记

论文标题 《Decoupled Optimisation for Long-Tailed Visual Recognition》 长尾视觉识别的解耦优化 作者 Cong Cong、Shiyu Xuan、Sidong Liu、Shiliang Zhang、Maurice Pagnucco 和 Yang Song、 来自新南威尔士大学计算机科学与工程学院、北京大学计算机学院多媒体信息处…

jenkins+gitlab+sonar自由风格项目配置

新建项目&基本配置 gitlab侧配置 sonar.projectKeytest_sonar sonar.projectNametest_sonar sonar.projectVersion1.0 sonar.sources. sonar.exclusionssrc/layout/** sonar.sourceEncodingUTF-8 sonar.nodejs.executable/app/nodejs/node-v16.20.2-linux-x64/bin/node配置…

pgsql查看指定模式的存储过程

pgsql查看指定模式的存储过程 在 PostgreSQL 中&#xff0c;如果你想要查看指定模式的存储过程&#xff08;也称为函数&#xff09;&#xff0c;你可以使用 \df 或 \df 命令在 psql 命令行工具中&#xff0c;或者使用 SQL 查询来从 pg_catalog 系统模式中查询。 \df命令行查询…

Linux 中 POSIX 互斥信号量(互斥锁)的使用

目录 一、互斥锁的介绍二、使用方法三、测试代码 一、互斥锁的介绍 在Linux系统中&#xff0c;特别是在ARM架构的嵌入式系统中&#xff0c;互斥量&#xff08;Mutex&#xff09;用于保护共享资源不被多个线程或任务同时访问&#xff0c;从而防止数据竞争和不一致性。 POSIX 互斥…

旅游组团奖励标准,申报条件!利川市旅游组团奖励办法

利川市旅游组团奖励有哪些&#xff1f;关于利川市旅游组团奖励标准&#xff0c;申报条件整理如下&#xff1a; 第一条根据《湖北省人民政府办公厅印发关于更好服务市场主体推动经济稳健发展若干政策措施的通知》&#xff08;鄂政办发〔2022〕54号&#xff09;、《恩施州人民政府…

一个完整性能测试流程(非常详细)零基础入门到精通,收藏这一篇就够了

一、性能测试流程规范化的意义 规范化的性能测试流程能帮助测试发现潜在的性能问题和瓶颈&#xff0c;也能确保性能测试的可重复性和可比性。 同时可以帮助确定系统的容量&#xff0c;降低风险及维护成本&#xff0c;提高用户体验和满意度。 二、性能测试流程 一&#xff09…

linux高性能服务器--Ngix内存池简单实现

文章目录 内存模型&#xff1a;流程图内存对齐code 内存模型&#xff1a; 流程图 内存对齐 对齐计算 要分配一个以指定大小对齐的内存&#xff0c;可以使用如下公式&#xff1a; 假设要分配大小为n&#xff0c;对齐方式为x&#xff0c;那么 size(n(x-1)) & (~(x-1))。 举个…

发表博客之:gemm/threadblock/threadblock_swizzle.h 文件夹讲解,cutlass深入讲解

文章目录 [发表博客之&#xff1a;gemm/threadblock/threadblock_swizzle.h 文件夹讲解&#xff0c;cutlass深入讲解](https://cyj666.blog.csdn.net/article/details/138514145)先来看一下最简单的struct GemmIdentityThreadblockSwizzle结构体 发表博客之&#xff1a;gemm/th…

InfiniGate自研网关实现四

13.服务发现组件搭建和注册网关连接 以封装 api-gateway-core 为目的&#xff0c;搭建 SpringBoot Starter 组件&#xff0c;用于服务注册发现的相关内容处理。 这里最大的目的在于搭建起用于封装网关算力服务的 api-gateway-core 系统&#xff0c;提供网关服务注册发现能力。…

【Python技术】使用akshare、pandas高效复盘每日涨停板行业分析

作为一个程序员宝爸&#xff0c;每天的时间很宝贵&#xff0c;工作之余除了辅导孩子作业&#xff0c;就是补充睡眠。 怎么快速高效的进行当天A股涨停板的复盘&#xff0c;便于第二天的跟踪。这里简单写个示例&#xff0c; 获取当天连涨数排序&#xff0c;以及所属行业排序。 …