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

news2024/11/27 14:57:39

一、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;
    }
};

 

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

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

相关文章

为什么在Python中总是使用【字典】这种类型呢?

你好&#xff0c;我是安然无虞。 文章目录 创建字典新增字典元素update 方法 删除字典元素pop 方法popitem 方法 查找字典元素in 和 in not 操作符get 方法thisdict[key] 修改字典元素遍历字典元素for循环遍历keys方法values方法items方法 合并字典字典中的key 字典常用接口汇…

深入解析大语言模型显存占用:训练与推理

深入解析大语言模型显存占用&#xff1a;训练与推理 文章脉络 估算模型保存大小 估算模型在训练时占用显存的大小 全量参数训练 PEFT训练 估算模型在推理时占用显存的大小 总结 对于NLP领域的从业者和研究人员来说&#xff0c;有没有遇到过这样一个场景&#xff0c;你的…

Java8之接口默认方法

Java8之接口默认方法 一、介绍二、代码1、接口2、实现类3、测试代码4、效果 一、介绍 在Java8中&#xff0c;允许为接口方法提供一个默认的实现。必须用default修饰符标记这样一个方法。默认方法也可以调用其他方法 二、代码 1、接口 public interface PersonService {void…

基于ARM内核的智能手环(day1)

整体介绍 智能手环由 ARM 内核 MCU(Cortex-M 系列)、TFTLCD 屏、温湿度传感器、心率传感器、 加速度传感器等主要几部分构成。该平台硬件采用 STM32 芯片&#xff0c;通过对温湿度传感器的驱动编写&#xff0c;获取周围温湿度数据&#xff0c;并在 LCD 屏显示&#xff0c;通过对…

算法学习——LeetCode力扣动态规划篇8

算法学习——LeetCode力扣动态规划篇8 300. 最长递增子序列 300. 最长递增子序列 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删…

会话跟踪技术(Session 以及Cookie)

一: 前提概要 1>会话: 会话指的是用户打开浏览器, 访问某些web服务器资源的时候, 会话就会进行建立, 直到有一方断开, 那么会话才会结束, 需要注意的一点是, 一次的会话可以有多次的请求以及响应 2>会话跟踪: 是一种用于维护浏览器状态的方法, 服务器需要识别多次的请求,…

基于springboot的船舶维保管理系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

深入理解Docker-使用Docker有什么优势?

Docker是什么&#xff1f; 我们先给出Docker官网给出的定义来看下Docker是什么&#xff1f; Docker加速你应用的构建&#xff0c;共享和运行。 怎么来加速的那&#xff1f; without tedious envionment configuration or management 不用进行哪些乏味的环境配置和管理。 怎么…

U盘无法打开?教你几招轻松解决数据恢复难题

在日常生活和工作中&#xff0c;U盘作为移动存储设备&#xff0c;承载着我们大量的重要数据。然而&#xff0c;当某一天我们满怀期待地将U盘插入电脑&#xff0c;却发现它无法被正常打开时&#xff0c;那种焦虑和挫败感简直让人崩溃。我们可能会尝试各种方法&#xff0c;如重新…

java将文件转成流文件返回给前端

环境&#xff1a;jdk1.8&#xff0c;springboot2.5.3,项目端口号&#xff1a;9100 1.待转换的文件 一、路径 二、文件内容 2.controller中代码 package com.example.pdf.controller;import com.example.pdf.service.GetFileStreamService; import org.springframework.web.b…

Java项目修改了代码总是不生效咋么个事

1.问题发现 自己修改了yml配置文件&#xff0c;然后发现重启项目访问还是原来的配置 查看target下的class文件 发现&#xff0c;这个值并没有变&#xff0c;也就是我们修改完代码其实是没有触发编译文件重新生成class的&#xff0c;这时候我们可以手动解决&#xff0c;选择m…

外包干了5天,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入杭州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

【Web】NSSCTF Round#20 Basic 个人wp

目录 前言 真亦假&#xff0c;假亦真 CSDN_To_PDF V1.2 前言 感谢17&#x1f474;没让我爆零 真亦假&#xff0c;假亦真 直接getshell不行&#xff0c;那就一波信息搜集呗&#xff0c;先开dirsearch扫一下 扫的过程中先试试常规的robots.txt,www.zip,shell.phps,.git,.sv…

笔迹/签名数据集汇总

这里只收集公开/易申请的数据集 数据集发表年份语言最小单元Writers/人规模颜色最小单元文件格式示例图片备注CSAFE Handwriting Database2019英语页9090 人*(3 次*9 个样本) 2430 页300 dpi 扫描png-HWDB2.0-2.22011汉字页1,019每人 5 页,共 5091 页灰度图dgrl-CEDAR2006英语…

【Java面试题】Redis中篇(高可用:主从复制、哨兵、集群)

文章目录 高可用14.Redis如何保证高可用&#xff1f;15.Redis的主从复制&#xff1f;16.Redis主从有几种常见的拓扑结构&#xff1f;17.Redis的主从复制原理了解吗&#xff1f;18.说说主从数据同步的方式&#xff1f;19.主从复制存在的问题&#xff1f;20.Redis Sentinel(哨兵)…

ATFX汇市:欧元区的2月M1增速为-7.7%,潜在通胀下修,欧元币值受冲击

ATFX汇市&#xff1a;衡量经济体的潜在通胀指标&#xff0c;除了CPI数据、失业率数据外&#xff0c;还有M1、M3数据。昨日&#xff0c;欧洲央行公布了2月份欧元区货币发展报告&#xff0c;其中提到&#xff1a;广义货币总量M3的年增长率从1月份的0.1%上升到2024年2月的0.4%&…

多线程JUC 第2季 synchornized和Lock锁(重入,公平)

一 锁 1.1 锁的介绍 synchronized&#xff0c;和lock锁都是一种悲观锁。悲观锁适用于写多场景&#xff0c;乐观锁适用于读多场景&#xff0c;实现策略有&#xff1a;版本号和cas自旋算法。

ubuntu22.04@Jetson Orin Nano安装配置VNC服务端

ubuntu22.04Jetson Orin Nano安装&配置VNC服务端 1. 源由2. 环境3. VNC安装Step 1: update and install xserver-xorg-video-dummyStep 2: Create config for dummy virtual displayStep3: Add the following contents in xorg.conf.dummyStep 4: Update /etc/X11/xorg.con…

CQ 社区版2.10.0 | 新增 SQL 审核、全新英文版上线…

三月中旬&#xff0c;我们预告了 CloudQuery 社区版即将上线的「SQL 审核」功能。现在&#xff0c;它来了&#xff01; 本次社区版 v2.10.0&#xff0c;除了 SQL 审核功能&#xff0c;我们还在手动授权、连接分组等模块做了新功能和优化。 新增功能 新增 SQL 审核功能 支持…

【STM32嵌入式系统设计与开发】——13WWDG(窗口看门狗应用)

这里写目录标题 一、任务描述二、任务实施1、WWDG工程文件夹创建2、函数编辑&#xff08;1&#xff09;主函数编辑&#xff08;2&#xff09;USART1初始化函数(usart1_init())&#xff08;3&#xff09;USART数据发送函数&#xff08; USART1_Send_Data&#xff08;&#xff09…