代码随想录训练营Day 28|力扣216.组合总和III、17.电话号码的字母组合

news2025/1/21 18:58:31

1.组合总和3

题目链接/文章讲解: 代码随想录

视频讲解:和组合问题有啥区别?回溯算法如何剪枝?| LeetCode:216.组合总和III_哔哩哔哩_bilibili

 代码:(这里剪枝的思路和昨天发的一样)

class Solution {
private:
    vector<vector<int>> result;
    vector<int> path;
    int sum = 0;
    void backtracking(int k, int n, int startIndex){
        // 递归出口
        if(path.size() == k){
            if(sum == n){
                result.push_back(path);
                return;
            }else{
                return;
            }
        }
        // 处理结点
        for(int i = startIndex;i <= 9 - (k - path.size() -1) ;i++){
            path.push_back(i);
            sum += i;
            backtracking(k,n,i + 1);
            sum -= i;
            path.pop_back();
        }
    }
public:
    vector<vector<int>> combinationSum3(int k, int n) {
        backtracking(k,n,1);
        return result;
    }
};

 代码:(又加了进一步剪枝的操作。因为给的数都是正数,和只能越加越大,所以当目前的和已经大于目标和,就可以剪枝了)

class Solution {
private:
    vector<vector<int>> result;
    vector<int> path;
    int sum = 0;
    void backtracking(int k, int n, int startIndex){
        // 剪枝(因为题上给的数1-9都是正数,和一定是越加越大)
        if(sum > n){
            return;
        }
        // 递归出口
        if(path.size() == k){
            if(sum == n){
                result.push_back(path);
                return;
            }else{
                return;
            }
        }
        // 处理结点
        for(int i = startIndex;i <= 9 - (k - path.size() -1) ;i++){
            path.push_back(i);
            sum += i;
            backtracking(k,n,i + 1);
            sum -= i;
            path.pop_back();
        }
    }
public:
    vector<vector<int>> combinationSum3(int k, int n) {
        backtracking(k,n,1);
        return result;
    }
};

思路:组合问题的去重是通过startIndex每次加1来确定的,我们可以保证在接下来的同一层的子树用到的元素和之前的不一样。

这道题的去重可以从两个角度来进行,一个是题上要求的个数,一个是题上要求的总和。个数已经不够题上要求的,整个子树都不满足要求;正数只会越加越大,现在的和就已经超过要求的,肯定不符合题意。

如果要把对和的剪枝放到操作结点(即for循环里)里,还得另外加上回溯操作。 

2.电话号码的字母组合 

题目链接/文章讲解:代码随想录

视频讲解:还得用回溯算法!| LeetCode:17.电话号码的字母组合_哔哩哔哩_bilibili

 代码:

class Solution {
private:
    vector<string> result;
    string s;
    const string lettermap[10]{
        "", // 0
        "", // 1
        "abc", // 2
        "def", // 3
        "ghi", // 4
        "jkl", // 5
        "mno", // 6
        "pqrs", // 7
        "tuv", // 8
        "wxyz", // 9
    };
    // 一层遍历一个数字对应的字符串
    // 这里的index表示:我们现在遍历哪个数字对应的字母,也是这里数的深度
    void backtracking(string& digits,int index){
        // 递归出口
        if(index == digits.size()){
            result.push_back(s);
            return;
        }
        // 我们需要将题上给的字符串转换成数字
        // 再将得到的数字对应到lettermap的元素上
        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();
        }
    }
public:
    vector<string> letterCombinations(string digits) {
        if(digits.size() == 0){
            return result;
        }
        backtracking(digits,0);
        return result;
    }
};

思路:这道题给的参数很绕,同时也是在回溯法里遇到的第一道需要在不同的集合里取值的情况。

关于参数:题上给的是号码的字符串,我们得先把字符串里的数字取出来(用字符去减‘0’),然后再找到这个号码所对应的字母字符串。

不同集合里取值:要用到index参数来切换不同的集合,在抽象成的树结构里每一次层,遍历一个数组,下一次递归时,让该值加1。这样就成功实现切换了。

如果面试问了这道题,还要考虑到输入其它号码的异常情况。

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

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

相关文章

vue 运行项目node-scss报错

vue项目node版本与自己电脑node版本不一样运行node导致报错 node-sass模块对node版本有兼容性&#xff0c;版本不适配&#xff0c;就容易报错 解决方案&#xff1a; 在项目目录下打开cmd&#xff1a; 输入命令&#xff1a; npm rebuild node-sass 然后再更新一下&#xff1a;…

linux性能监控之free

free&#xff1a;linux系统自带命令&#xff0c;显示内存状态&#xff0c;命令查询来源于/proc/meminfo 文件 [rootk8s-master ~]# free --helpUsage:free [options]Options:-b, --bytes show output in bytes-k, --kilo show output in kilobytes-m, --mega…

macOS上使用qt creator编译调试ffmpeg.c

1 前言 上文macOS上将ffmpeg.c编译成Framework介绍了使用xocde将ffmpeg.c编译成Framework的方法&#xff0c;这里列举另外一种办法&#xff0c;就是用qt creator来完成这件事情。 编译环境如下&#xff1a; qt creator 9.0.2&#xff1b;ffmpeg release/6.1; 2 编译ffmpeg.c 大…

应用层(上篇)

应用层 应用层协议原理 网络应用程序体系解构 应用程序体系结构: 由应用程序研发者设计规定了如何在各种端系统上组织该应用程序。在选择应用程序体系结构时&#xff0c;应用程序研发者很可能利用现代网络应用程序中所使用的两种主流体系结构之一:客户-服务器体系结构或对等…

C语言例题41、八进制转换为十进制

#include<stdio.h>void main() {int x;printf("请输入一个8进制整数&#xff1a;");scanf("%o", &x);printf("转换成十进制后的整数为%d\n", x); }运行结果&#xff1a; 本章C语言经典例题合集&#xff1a;http://t.csdnimg.cn/FK0Qg…

网上办理无犯罪证明

在微信小程序 搜 比如 河南 就搜 河南无犯罪证明&#xff0c;这个时候会出现一个公众号&#xff0c;进去之后注册一个账号和密码&#xff1b;登录成功后并找到无犯罪证明&#xff0c;按照人家的操作步骤进行操作&#xff1b;最终预约成功后 几个工作日会给你发一个电子版的无犯…

【Python】一文详细介绍 pkl格式 文件

【Python】一文详细介绍 pkl格式 文件 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您的订阅和支持~ &#x…

(八)SQL基础知识练习题(选择题)(下)#CDA学习打卡

本文整理了SQL基础知识相关的练习题&#xff0c;共133道&#xff0c;可作为CDA一级的补充习题&#xff0c;也适用于刚入门初级SQL想巩固基础的同学。来源&#xff1a;如荷学数据科学题库&#xff08;技术专项-SQL&#xff09;。暂时按照原题库顺序present&#xff0c;如有需要之…

【每日刷题】Day40

【每日刷题】Day40 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 202. 快乐数 - 力扣&#xff08;LeetCode&#xff09; 2. 217. 存在重复元素 - 力扣&#xff08;Le…

优选算法——双指针1

双指针 常⻅的双指针有两种形式&#xff0c;⼀种是对撞指针&#xff0c;⼀种是左右指针。 对撞指针&#xff1a;⼀般⽤于顺序结构中&#xff0c;也称左右指针。 对撞指针从两端向中间移动。⼀个指针从最左端开始&#xff0c;另⼀个从最右端开始&#xff0c;然后逐渐往中间逼 近…

Linux提权--Rsync(未授权访问) Docker 组挂载

免责声明:本文仅做技术学习与交流... 目录 Rsync&#xff08;未授权访问&#xff09; 介绍: 靶场及过程: 提权过程&#xff1a; Docker 组挂载 原理: 复现&#xff1a; 利用&#xff1a; 具体操作: 1-确定是否有docker服务 2-查看用户是否在docker组里面 3-执行命…

Raft论文阅读笔记+翻译:In Search of Understandable Consensus Algorithm

In Search of Understandable Consensus Algorithm 摘要 Raft是一种管理复制日志的共识算法。它产生与&#xff08;多&#xff09;Paxos等效的结果&#xff0c;并且与Paxos一样高效&#xff0c;但其结构与Paxos不同。这使得Raft比Paxos更易理解&#xff0c;也为构建实际系统提供…

面试官:假如有几十个请求,如何去控制并发?

控制并发请求是一个重要的问题&#xff0c;特别是在面对高并发情况时&#xff0c;合理地管理请求可以有效地维护系统的稳定性和性能。以下是一些常见的方法来控制并发请求&#xff1a; 1. 线程池&#xff1a;使用线程池来管理并发请求&#xff0c;通过限制线程数量和队列大小&…

ComfyUI相见恨晚的提示词插件,简直堪称神器!

之前我曾介绍过一款专为SD设计的中文提示词插件——prompt-all-in-one&#xff0c;想必使用过的小伙伴们都已经感受到了它的便捷与实用吧。 不过&#xff0c;那款插件是基于webUI版本的&#xff0c;而现在&#xff0c;越来越多的朋友开始探索ComfyUI这一新选择。 假如在Comfy…

C++基础与深度解析 | 数组 | vector | string

文章目录 一、数组1.一维数组2.多维数组 二、vector三、string 一、数组 1.一维数组 在C中&#xff0c;数组用于存储具有相同类型和特定大小的元素集合。数组在内存中是连续存储的&#xff0c;并且支持通过索引快速访问元素。 数组的声明&#xff1a; 数组的声明指定了元素的…

virtualBox不能创建虚拟文件夹

问题如下图&#xff0c;在点击下一步时提示不能创建虚拟机文件夹 问题原因是使用了virtualBox的安装目录&#xff0c;在全局设定中设置虚拟电脑位置&#xff0c;不再使用virtualBox的安装目录 再次点击新建&#xff0c;就可以创建了。

无线网卡网络老断网

无线网卡网络老断网 设置 Intel AX210 无线网卡 路由器华为 AX3 问题及解决 问题 无线网卡连接到 wifi &#xff0c;连接不通&#xff0c;或者连接上后网络很慢&#xff0c;延时大&#xff0c;掉包。 解决方案 调整如下界面&#xff0c;调整信道后&#xff0c;连接正常。…

亚马逊卖家,如何打造爆款,如何提高产品权重、曝光、流量?

新老卖家们要知道&#xff0c;亚马逊A9算法影响产品排名的关键因素&#xff1a;产品相关性、销售排名、产品价格、点击率、转化率、产品图片、买家评论、买家满意度、QA的答复情况、搜索结果页详细信息级别。亚马逊A9算法&#xff0c;是根据卖家提供的listing文案信息进行收录、…

常见加解密算法02 - RC4算法分析

RC4是一种广泛使用的流密码&#xff0c;它以其简洁和速度而闻名。区别于块密码&#xff0c;流密码特点在于按位或按字节来进行加密。 RC4由Ron Rivest在1987年设计&#xff0c;尽管它的命名看起来是第四版&#xff0c;实际上它是第一个对外发布的版本。 RC4算法的实施过程简洁…

动态el-form表单以及动态禁用

当右侧下拉框选中为 长期有效,那么左侧输入框为禁用状态; <el-form-item label"证明有效期" class"is-required"><div v-for"(item,index) in form.arrayDat" :key"index" style"width: 100%;display: flex;justify-co…