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

前言

更详细的在大佬的代码随想录 (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,一经查实,立即删除!

相关文章

postgres 查看全部数据库

在 PostgreSQL 中&#xff0c;要查看所有的数据库&#xff0c;你可以使用 psql 命令行工具并执行一个特定的命令。以下是查看所有数据库的步骤&#xff1a; 打开终端&#xff1a; 首先&#xff0c;打开你的终端或命令行界面。 连接到 PostgreSQL&#xff1a; 使用 psql 连接到…

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、准备工作相关命令…

全球科技早参丨皮查伊:智能手机将是AI创新的核心平台、科学家研制出超纯硅 | 最新快讯

每经记者&#xff1a;文巧 每经编辑&#xff1a;兰素英 &#xff5c;2024年5月10日 星期五&#xff5c; NO.1 Neuralink首例人类脑机接口手术后设备出现问题 Neuralink最新宣布&#xff0c;在今年1月实施首例人类手术后&#xff0c;植入受试病患的设备遭遇了一系列机械故障。…

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…

太极(ROOT)宣布永久停更

2024年5月9日&#xff0c;太极root的开发者在自己的博客宣布永久停更。 以下是原文&#xff1a; 亲爱的小伙伴们&#xff0c;太极问世至今已逾六年&#xff0c;这段时间里我们留下了许多美好的回忆。然而&#xff0c;旅程总有一天会迎来终点&#xff0c;现在是时候与大家道别…

xxe漏洞漏洞详解

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

C语言中 #include<>与 include ““的区别

一. C语言中 #include<> 与 include "" 的区别 1. 头文件 C语言中头文件以 .h为后缀 的文件&#xff0c;头文件中包含了函数的声明和宏定义&#xff0c;头文件可以被多个源文件引用。 在C语言中有两种类型的头文件&#xff0c;一种是编译器自带的头文件&a…

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

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

一栈走天下:使用HBuilderX高效搭建Uni-App微信小程序开发环境

一栈走天下&#xff1a;使用HBuilderX高效搭建Uni-App微信小程序开发环境 Uni-App与HBuilderX简介Uni-App基础HBuilderX介绍 环境搭建步骤步骤1&#xff1a;安装HBuilderX步骤2&#xff1a;创建Uni-App项目步骤3&#xff1a;配置微信小程序平台步骤4&#xff1a;预览与发布 代码…

Nvidia docker 验证HSOpticalFlow

前情提要&#xff1a; docker是dotCloud 公司为了数据库研发的&#xff0c;所以仅支持CPU和数据交换的部分&#xff0c;nvidia公司觉得这是个好东西&#xff0c;自己派人研发了GPU相关的部分&#xff0c;取名为NVIDIA Container Toolkit&#xff0c;我们可以理解为dockerGPU插…

队列和二叉树

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

设计模式——解释器模式(Interpreter)

解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为型设计模式&#xff0c;它给定一个语言&#xff0c;定义它的文法的一种表示&#xff0c;并定义一个解释器&#xff0c;该解释器使用该表示来解释语言中的句子。这种模式主要用来描述如何使用面向对象语言构成一…

VRRP(Virtual Router Redundancy Protocol)虚拟路由器冗余协议

VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09;即虚拟路由器冗余协议&#xff0c;是一种网络容错协议。VRRP通过在多个路由器间建立虚拟的路由身份&#xff0c;提供了一种简单高效的机制来保障网络出口点的高可用性&#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配置…