代码随想录算法训练营第二十五天| 回溯算法理论基础、LeetCode77.组合

一、216.组合总和III

题目链接/文章讲解/视频讲解: https://programmercarl.com/0216.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8CIII.html
状态:已解决

1.思路 

        做过77题(上篇博客)后,这道题也就不难了,无非是多加了一个条件:组合之和等于n,只需要将这个加到终止条件那里即可。但这道题也有简化的地方,就是明确了每个样例的整个集合已经是固定的[1,...,9]。做过77就明白此题的做题套路了。

        直接套模板:

(1)返回值为空,参数需要有:每层递归for循环的开始值m(组合无序,若每层递归for循环都是1~9,那么会出现{1,3}和{3,1}这种相同的组合方式)、前面递归所选值的累加和sum、n、k。

void backtracking(int m,int k,int n,int sum)

(2)终止条件:vec.size() == k(vec是存放一条路径的变量),sum==n。

if(vec.size() == k){
    if(sum==n)
        result.push_back(vec);
    return ;//一定要return
}

(3)单层递归逻辑:for循环m~9,i的值放入vec中,sum加上i,开始子递归,然后再将i弹出。

for(int i=m;i<=9;i++){
    vec.push_back(i);
    backtracking(i+1,k,n,sum+i);
    vec.pop_back();
}

2.完整代码

class Solution {
public:
    vector<int> vec;
    vector<vector<int>> result;
    void backtracking(int m,int k,int n,int sum){
        if(vec.size() == k){
            if(sum==n)
                result.push_back(vec);
            return ;
        }
        for(int i=m;i<=9;i++){
            vec.push_back(i);
            backtracking(i+1,k,n,sum+i);
            vec.pop_back();
        }
    }
    vector<vector<int>> combinationSum3(int k, int n) {
        vec.clear();
        result.clear();
        backtracking(1,k,n,0);
        return result;
    }
};

另外,还可以减枝:当sum>n时,也终止。(for循环终止条件也可以为 i<9-(k-vec.size())+1 ,跟vec.size()==k终止差不多,故未添加。)

class Solution {
public:
    vector<int> vec;
    vector<vector<int>> result;
    void backtracking(int m,int k,int n,int sum){
        if(sum > n) return;
        if(vec.size() == k){
            if(sum==n)
                result.push_back(vec);
            return ;
        }
        for(int i=m;i<=9;i++){
            vec.push_back(i);
            backtracking(i+1,k,n,sum+i);
            vec.pop_back();
        }
    }
    vector<vector<int>> combinationSum3(int k, int n) {
        vec.clear();
        result.clear();
        backtracking(1,k,n,0);
        return result;
    }
};

二、LeetCode77.组合

题目链接/文章讲解/视频讲解: https://programmercarl.com/0017.%E7%94%B5%E8%AF%9D%E5%8F%B7%E7%A0%81%E7%9A%84%E5%AD%97%E6%AF%8D%E7%BB%84%E5%90%88.html
状态:已解决

1.思路

        首先,这里有一段对应关系,每个数字对应几个字符。因此,我们第一步需要先存一个对应的字典。(这里可以用字符串数组存,也可以用vector<string>存,当然也可以用map做映射)

map<string,string> dic;
Solution() {
    dic["2"] = "abc";
    dic["3"] = "def";
    dic["4"] = "ghi";
    dic["5"] = "jkl";
    dic["6"] = "mno";
    dic["7"] = "pqrs";
    dic["8"] = "tuv";
    dic["9"] = "wxyz";
}

         做完这步后面回溯三部曲就跟前面的差不多了。

 (1)返回值为空,参数需要有:目前遍历到digits的位置k、目前选择路径path、digits。

void backtracking(string digits, int k, string path)

(2)终止条件digits.size() == k,sum==n。

if(digits.size() == k){
    result.push_back(path);
    return ;
}

(3)单层递归逻辑:根据k得出当前位置的数字,根据字典得到该数字对应的字符串,然后用for循环选择的字符加入现有路径中。

string s = dic[digits.substr(k, 1)];
for(int i=0; i<s.size(); i++){
    backtracking(digits, k+1, path + s[i]);
}

2.完整代码

class Solution {
public:
    map<string,string> dic;
    vector<string> result;
    
    Solution() {
        dic["2"] = "abc";
        dic["3"] = "def";
        dic["4"] = "ghi";
        dic["5"] = "jkl";
        dic["6"] = "mno";
        dic["7"] = "pqrs";
        dic["8"] = "tuv";
        dic["9"] = "wxyz";
    }
    
    void backtracking(string digits, int k, string path){
        if(digits.size() == k){
            result.push_back(path);
            return ;
        }
        string s = dic[digits.substr(k, 1)];
        for(int i=0; i<s.size(); i++){
            backtracking(digits, k+1, path + s[i]);
        }
    }
    
    vector<string> letterCombinations(string digits) {
        result.clear();
        if(digits.size() == 0) {
            return result;
        }
        backtracking(digits, 0, "");
        return result;
    }
};

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数字化转型导师坚鹏:BLM新质生产力发展方法论

BLM新质生产力发展方法论 ——新质生产力发展之知行果合一 课程背景&#xff1a; 很多学员存在以下问题&#xff1a; 不知道如何理解新质生产力&#xff1f; 不清楚如何发展新质生产力&#xff1f; 不知道新质生产力发展案例&#xff1f; 课程特色&#xff1a; 原创…

echarts统计图占满整个容器

原先的统计图表没有占满容器&#xff0c;感觉整个被压缩了 网上查阅相关资料后发现需要设置grid一个配置项&#xff08;有些数值需要根据实际情况进行调整&#xff09; grid:{top:"0px",left:"0px",right:"0px",bottom:"0px"} 对于gr…

用户登录.java

分析&#xff1a; 1&#xff0c;用String来定义两个变量&#xff0c;记录正确的用户名和密码----->直接赋值得来 2&#xff0c;键盘录入用户名和密码------>new开辟空间得来&#xff0c;存的是地址值 他们直接用比较大小,必定不相同&#xff0c;需要用到String里面的方…

沙箱安全机制

Java安全模型的核心就是Java沙箱(sandbox)&#xff0c; 什么是沙箱&#xff1f; 沙箱是一个 限制程序运行的环境。沙箱机制就是将Java代码限定在虚拟机(JVM) 特定的运行范围中&#xff0c;并且严格限制代码对本地系统资源访问&#xff0c;通过这样的措施来保证 对代码的 有效隔…

QT中的文件操作QFile、QDataStream、QTextStream、QBuffer

文件操作概述 1、Qt中IO操作的处理方式 &#xff08;1&#xff09;、Qt通过统一的接口简化了文件与外部设备的操作方式 &#xff08;2&#xff09;、Qt中的文件被看做是一种特殊的外部设备 &#xff08;3&#xff09;、Qt中的文件操作与外部设备操作相同 2、IO操作中的关键…

基于协同过滤算法的图书推荐系统(ssm+jsp)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的基于协同过滤算法的图书推荐系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 管理员功能需求…

C语言例1-11:语句 while(!a); 中的表达式 !a 可以替换为

A. a!1 B. a!0 C. a0 D. a1 答案&#xff1a;C while()成真才执行&#xff0c;所以!a1 &#xff0c;也就是 a0 原代码如下&#xff1a; #include<stdio.h> int main(void) {int a0;while(!a){a;printf("a\n");} return 0; } 结果如…

Soot入门学习笔记

Soot 适合参考的文档和教程如下&#xff1a; 北京大学软件分析技术 南京大学软件分析 Tutorials for soot McGill University 198:515 (vt.edu) 比较好的笔记资料&#xff1a; 南京大学《软件分析》课程笔记 比较好的入门作业或者案例&#xff1a; CSCE710 Assignmen…

vue3如何二次封装el-upload组件进行图片上传及删除

实现功能&#xff1a; 1、封装el-upload组件&#xff0c;父组件可以控制图片上传框的宽高 2、父组件可以传入提示信息&#xff0c;利用具名插槽 3、上传前的校验 4、实现删除功能 不同配置下的效果&#xff1a; 下边案例是图片上传的时候没有掉接口&#xff0c;在整体提交的时…

省级-能源结构数据(电力消费水平)(2000-2022年)

能源结构指能源总生产量或总消费量中各类一次能源、二次能源的构成及其比例关系。它是能源系统工程研究的重要内容&#xff0c;直接影响着国民经济各部门的最终用能方式&#xff0c;并反映了人民的生活水平。能源结构主要由生产结构和消费结构组成。 本数据通过电力消费水平来…

HarmonyOS 应用开发之FA模型与Stage模型应用组件

应用配置文件概述&#xff08;FA模型&#xff09; 每个应用项目必须在项目的代码目录下加入配置文件&#xff0c;这些配置文件会向编译工具、操作系统和应用市场提供描述应用的基本信息。 应用配置文件需申明以下内容&#xff1a; 应用的软件Bundle名称&#xff0c;应用的开发…

Delphi 12 安卓 部署文件,不支持中文文件名

procedure TForm3.Button1Click(Sender: TObject); var sFileName:string; begin sFileName:TPath.Combine(TPath.GetDocumentsPath,禁止吸烟.wav); showmessage(sFileName); MediaPlayer1.Stop ; MediaPlayer1.FileName: sFileName; MediaPlayer1.Play; end;

Python之Opencv教程(3):人脸识别

1、人脸识别代码 直接上代码&#xff1a; import cv2# 加载训练数据集文件 recogizer cv2.face.LBPHFaceRecognizer_create()recogizer.read(trainer/trainer.yml)# 准备识别的图片 img cv2.imread(images/lisa.jpg) gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)face_dete…

Linux文件系统权限

文件的一般权限 每个文件针对每类访问者定义了三种主要权限&#xff1a; r&#xff1a;read 读 w&#xff1a;write 写 x&#xff1a;execute 执行 所属者/组/其他用户权限的字符表示二进制表示八进制表示---0000--x0011-w-0102-wx0113r--1004r-x1015rw-1106rwx1117 文件/目…

企业培训系统功能介绍

在当今知识经济时代&#xff0c;企业的竞争力在很大程度上取决于员工的专业能力和综合素质。为了适应不断变化的市场需求和技术进步&#xff0c;企业需要对员工进行持续有效的培训。一个高效的企业培训系统对企业人才培训至关重要。以下介绍一下企业培训系统的主要功能&#xf…

《操作系统导论》第15章读书笔记:机制:地址转换(address translation)

《操作系统导论》第15章读书笔记&#xff1a;机制&#xff1a;地址转换&#xff08;address translation&#xff09; —— 杭州 2024-03-30 夜 文章目录 《操作系统导论》第15章读书笔记&#xff1a;机制&#xff1a;地址转换&#xff08;address translation&#xff09;1.前…

c语言:用do-while输出前40项的斐波那契数值

求Fibonacci数列的前40个元素。该数列的特点是第1、2两个数为1、1。从第3个数开始&#xff0c;每数是其前两个数之和。 分析&#xff1a;从题意可以用如下等式来表示斐波那契数列&#xff1a; 1&#xff0c; 1&#xff0c; 2&#xff0c; 3&#xff0c; 5&#xff0c; 8&#x…

FA模型切换Stage模型组件切换之PageAbility切换

FA模型中PageAbility对应Stage模型中的UIAbility&#xff0c;PageAbility切换为UIAbility的方法如下。 在Stage应用中 创建UIAbility。 将FA应用中PageAbility的代码迁移到新创建的UIAbility中。 FA应用中PageAbility和Stage应用中的UIAbility生命周期基本一致&#xff0c;两者…

面试八股——redis——集群

0. redis集群的方案 1.主从复制&#xff08;高并发读&#xff09; 一个主节点负责写操作&#xff08;增删改&#xff09;&#xff0c;多个从节点负责查操作。 主从复制是让主节点修改数据之后&#xff0c;将对应数据同步到从节点中。 2.哨兵模式&#xff08;实现高可用&#x…

输出单链表倒数第K个结点值

方法一&#xff1a; 两次遍历链表。第一次遍历&#xff0c;计算链表长度&#xff0c;然后计算链表倒数第m个结点的正数位置k&#xff0c;判断位置是否合法&#xff0c;如果不合法&#xff0c;输出NOT FOUND&#xff0c;否则&#xff0c;进行第二次遍历链表&#xff0c;查找链表…