代码随想录算法训练营第二十五天|Leetcode216 组合总和III、Leetcode17 电话号码的字母组合

news2024/11/25 4:53:46

代码随想录算法训练营第二十五天|Leetcode216 组合总和III、Leetcode17 电话号码的字母组合

  • ● Leetcode216.组合总和III
    • ● 解题思路
    • ● 代码实现
  • ● Leetcode17 电话号码的字母组合
    • ● 解题思路
    • ● 代码实现

● Leetcode216.组合总和III

题目链接:Leetcode216.组合总和III
视频讲解:代码随想录|组合总和III
题目描述:找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:
· 只使用数字1到9
· 每个数字 最多使用一次
返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。

示例 1:
输入: k = 3, n = 7
输出: [[1,2,4]]
解释:
1 + 2 + 4 = 7
没有其他符合的组合了。
示例 2:
输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]
解释:
1 + 2 + 6 = 9
1 + 3 + 5 = 9
2 + 3 + 4 = 9
没有其他符合的组合了。
示例 3:
输入: k = 4, n = 1
输出: []
解释: 不存在有效的组合。
在[1,9]范围内使用4个不同的数字,我们可以得到的最小和是1+2+3+4 = 10,因为10 > 1,没有有效的组合。

提示:
· 2 <= k <= 9
· 1 <= n <= 60

● 解题思路

在leetcode77 组合的基础上,组合总和III增加了一个条件是:在[1, 9]的范围内寻找k个和为n的组合。
我们同样可以将本题抽象为树形结构,树的深度取决与组合元素个数限制,宽度取决与元素个数;为了去掉重复组合,当第一层递归取了元素i,则可与该元素匹配的仅为[i + 1, 9],如下图:
树形结构
按照回溯三部曲:
(1)确定回溯函数参数和返回值:
回溯函数直接在全局变量result和path上进行修改,因此对于回溯函数不需要任何返回值;同时,在每层递归的过程,需要传入目标和targetSum确定是否满足解题条件,当前元素总和sumtargetSum比较,元素遍历开始位置startIndex以及组合元素个数上限k
(2)确定回溯函数的终止条件:
相比对组合,本题多加了一条限制条件targetSum,因此对于终止条件(回收结果的条件)需要在叶子结点的基础上限制sum与targetSum大小比较
(3)确定回溯函数单层搜索过程:
i.递归- 遍历元素并插入到当前path容器中,并对sum进行增加并乡下递归:该过程模拟从[1, 9]中取k个元素,并记录元素总和与targetSum比较;
ii.回溯- sum减去插入的新元素并在path中弹出:该过程模拟回溯过程。


同样,本题可以进行剪枝操作:
(1)对于解题条件targetSum,当sum已经大于targetSum时,其后面元素再加进path只可能更大,使得条件越来越远,因此该过程可以进行剪枝;
(2)对于单层遍历范围,目前元素个数为path.size(),组合剩余需要元素个数为k - path.size(),当i遍历到9 - (k - path.size) + 1时,后面的元素在个数上无法满足k个元素的需求,因此可以进行剪枝。

● 代码实现

class Solution {
private:
    vector<vector<int>> result;
    vector<int> path;

    void backtracking(int targetSum, int sum, int k, int startIndex)
    {
        //终止条件
        if(path.size() == k)
        {
            if(sum == targetSum)
            {
                result.push_back(path);
                return;
            }
        }

        for(int i = startIndex; i <= 9; i++)
        {
            sum += i;
            path.push_back(i);
            backtracking(targetSum, sum, k, i + 1);
            sum -= i;
            path.pop_back();
        }
    }
public:
    vector<vector<int>> combinationSum3(int k, int n) {
        backtracking(n, 0, k, 1);
        return result;
    }
};

进行剪枝操作之后的代码为:

class Solution {
private:
    vector<vector<int>> result;
    vector<int> path;
    void backtracking(int targetSum, int sum, int k, int startIndex)
    {
        if(sum > targetSum)
        {
            return;
        }
        if(path.size() == k)
        {
            if(sum == targetSum)
            {
                result.push_back(path);
                return;
            }
        }

        for(int i = startIndex; i <= (9 - (k - path.size()) + 1); i++)
        {
            sum += i;
            path.push_back(i);
            backtracking(targetSum, sum, k, i + 1);
            sum -= i;
            path.pop_back();
        }
    }
public:
    vector<vector<int>> combinationSum3(int k, int n) {
        backtracking(n, 0, k, 1);
        return result;
    }
};

● Leetcode17 电话号码的字母组合

题目链接:Leetcode17 电话号码的字母组合
视频讲解:代码随想录|电话号码的字母组合
题目描述:给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
电话按键

示例 1:
输入:digits = “23”
输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]
示例 2:
输入:digits = “”
输出:[]
示例 3:
输入:digits = “2”
输出:[“a”,“b”,“c”]

提示:
· 0 <= digits.length <= 4
· digits[i] 是范围 [‘2’, ‘9’] 的一个数字。

● 解题思路

对于电话号码的字母组合,就是依次地从每一个字符串中取一个字符进行配对,也能转换为相对应的树形结构,递归深度取决于输入数字的个数,宽度取决于第一个字符串的大小。
按照回溯三部曲:
(1)确定回溯函数参数和返回值:
我们需要将字符串与输入的数字字符串进行一个映射,因为是对全局变量进行修改,因此该函数不需要任何返回值,参数需要传入digits来知道应该取哪几个数字的映射,index则是标记我们当前遍历到第几个数字字符;
(2)确定回溯函数终止条件:
当递归到叶子结点时,我们就需要对当前结果字符串进行回收,也就是我们遍历完最后一个数字字符对应的映射字符集,即当index = digits.size()
(3)确定确定回溯函数单层搜索过程:
在确定单层搜索过程之前,我们需要两步prerequisites来帮助我们在之后进行搜索:
(1)因为我们传入的digits是数字字符串,因此我们需要在每一层递归中将当前遍历的字符转换为数字类型;
(2)得到对应的数字之后,我们就需要从映射关系中取得相应的字符集进行搜索匹配。

在以上两步的基础上,我们分别用digit来保存当前字符对应的数字,letters保存对应数字取得的字符集映射。
在每一层递归循环中,我们将取得的字符逐个加入当前字符结果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
    };

    string s; //存储组合当前字符串
    vector<string> result; //存储结果集
    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();
        }
    }
public:
    vector<string> letterCombinations(string digits) {
        if(digits.size() == 0) return result;
        backtracking(digits, 0);
        return result;
    }
};

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

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

相关文章

计算机网络-局域网和城域网(二)

1.局域网互联设备&#xff1a; 2层网桥&#xff08;生成树、源路由&#xff09;、3层交换机、路由器。网桥要求3层以上协议相同&#xff0c;1、2层协议不同可互联。 2.生成树网桥&#xff1a; 又叫透明网桥&#xff0c;IEEE802.1d&#xff0c;生成树算法。基本思想是在网桥之…

2024.2.22

将互斥机制的代码实现 #include<myhead.h> int num7; pthread_mutex_t mutex;//创建互斥锁变量 void *task1(void *arg) {printf("task1:\n");//获取锁资源pthread_mutex_lock(&mutex);num77777;sleep(2); printf("task1:num%d\n",num); //释放…

分享WebGL物体三维建模

界面效果 代码结构 模型素材类似CT (Computed Tomography)&#xff0c;即电子计算机断层扫描&#xff0c;它是利用精确准直的X线束、γ射线、超声波等&#xff0c;与灵敏度极高的探测器一同围绕物体的某一部位作一个接一个的断面扫描。 坐标系统 渲染流程 渲染流程是个将之前准…

报表控件Stimulsoft 新版本2024.1中,功能区工具栏新功能

今天&#xff0c;我们将讨论Stimulsoft Reports、Dashboards 和 Forms 2024.1版本中的一项重要创新 - 在一行中使用功能区工具栏的能力。 Stimulsoft Ultimate &#xff08;原Stimulsoft Reports.Ultimate&#xff09;是用于创建报表和仪表板的通用工具集。该产品包括用于WinF…

game项目(梦开始的地方)

梦开始的地方 由于easyx只支持vis&#xff0c;所以这个项目的书写以后都是在vis上进行&#xff0c;希望自己能够把这个项目好好完成&#xff0c;相信自己&#xff0c;加油&#xff01; 我们需要一个头文件来包括作图工具 (这个头文件在easyx上面下载) #include<graphics.…

PostgreSQL与MySQL,谁更胜一筹

前言 PostgreSQL与MySQL都是优秀的开源数据库。在日常学习中&#xff0c;新手可能接触最多的是MySql,但是实际工作中&#xff0c;两者的应用场景其实都很广。我之前的做过上网流量销售业务&#xff0c;用的是MySQL,现在接触广告业务&#xff0c;用的是pg数据库&#xff0c;每天…

汉诺塔问题—java详解(附源码)

来源及应用 相传在古印度圣庙中&#xff0c;有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上&#xff0c;有三根杆(编号A、B、C)&#xff0c;在A杆自下而上、由大到小按顺序放置64个金盘(如图1)。游戏的目标&#xff1a;把A杆上的金盘全部移到C杆上&#xff0c;并仍…

Spring学习上下文【ConfigurableApplicationContext】

话不多说&#xff0c;先上图&#xff1a; ConfigurableApplicationContext是Spring框架中的一个接口&#xff0c;它继承了ApplicationContext接口&#xff0c;并扩展了一些额外的方法&#xff0c;用于允许应用程序在运行时动态地修改和管理应用上下文。ConfigurableApplicati…

matlab代码--基于matlabLDPC-和积译码系统

LDPC编码 一个码长为n、信息位个数为k的线性分组码&#xff08;n,k&#xff09;可以由一个生成矩阵 来定义&#xff0c;信息序列 通过G被映射到码字XS.G。线性分组码也可以由一个校验矩阵 来描述。所以码字均满足 。校验矩阵的每一行表示一个校验约束 &#xff0c;其中所有的非…

【大数据】Flink 之部署篇

Flink 之部署篇 1.概述和参考架构2.可重复的资源清理3.部署模式3.1 Application 模式3.2 Per-Job 模式&#xff08;已废弃&#xff09;3.3 Session 模式 Flink 是一个多用途框架&#xff0c;支持多种不同的混合部署方案。下面&#xff0c;我们将简要介绍 Flink 集群的构建模块、…

免费搭建个人网盘

免费搭建一个属于个人的网盘。 服务端 详情请参考原网站的服务端下载和安装虚拟磁盘Fuse4Ui可以支持把网盘内容挂载成系统的分区&#xff1b; 挂载工具效果图&#xff1a;应用端应用端的下载 效果图

教你零基础制作产品画册,打开线上市场

​ 随着市场竞争的日益激烈&#xff0c;越来越多的企业开始注重产品的宣传和推广。而产品画册作为产品宣传的重要手段之一&#xff0c;也越来越受到企业的关注。今天&#xff0c;分享一个零基础制作产品画册的方法&#xff0c;帮助你打开线上市场的大门 1.选择合适的企业宣传…

代码随想录算法训练营第58天 | 392.判断子序列 115.不同的子序列

判断子序列 这道题可以双指针方法解决。 class Solution { public:bool isSubsequence(string s, string t) {int s_index 0;for(int t_index 0; t_index < t.size(); t_index) {if(s[s_index] t[t_index]) {s_index;}}return s_index s.size();} };用动态规划也是可解…

cilium-agent远程debug

文章目录 概述编译cilium-agent运行cilium-agent开启远程debug参考资料 概述 通过远程 debug&#xff0c;来分析 cilium-agent 是如何在容器创建的时候定义容器网络接口。 编译cilium-agent 首先是在本地编译 cilium-agent&#xff0c;下面是以 v1.14.4 的代码作为例子来阐述…

AJAX.

概念:AJAX&#xff1a;异步的 JavaScript 和 XML AJAX作用: 1.与服务器进行数据交换: 通过AJAX可以给服务器发送请求&#xff0c;并获取服务器响应的是数据 使用了AJAX和服务器进行通讯&#xff0c;就可以使用HTML和AJAX来替换JSP页面了 2.异步交互:可以在不重新加载整个页面的…

VSCode The preLaunchTask ‘C/C++: clang++ 生成活动文件‘ terminated with exit code -1

更改tasks.json文件里面的type为shell 选择g 选择g&#xff0c;然后点回到text.c&#xff0c;按下F5. 得到结果。 文中内容参考: 从零开始手把手教你配置属于你的VS Code_哔哩哔哩_bilibili https://blog.csdn.net/qq_63872647/article/details/128006861

Windows7安装指南

概要&#xff1a; 本篇演示Windows7的安装过程 一、说明 1、电脑 笔者的电脑品牌是acer(宏碁/宏基) 电脑开机按F2可进入BIOS 2、Windows7启动U盘 Windows7启动U盘作为Windows7的安装来源 该U盘的制作可参考笔者的文章 Windows制作Windows的U盘启动盘 Windows7没有USB…

《图解HTTP》笔记1:http的诞生

1&#xff0c;http的诞生&#xff1a; 1.1 为共享知识而生 我们现在使用web&#xff08;World Wide Web的简称&#xff0c;即万维网&#xff09;浏览器&#xff0c;目前可以输入一个网址&#xff08;http://www.baidu.com)&#xff0c;就会有一个网页显示出来。 最开始设想出…

百面嵌入式专栏(经验篇)如何在面试中介绍自己的项目经验

文章目录 1. 在面试前准备项目描述,别害怕,因为面试官什么都不知道2. 准备项目的各种细节,一旦被问倒了,就说明你没做过3.不露痕迹地说出面试官爱听的话4.一定要主动,面试官没有义务挖掘你的亮点5.一旦有低级错误,可能会直接出局6.引导篇:准备些加分点,在介绍时有意提到…

36、IO进程线程/进程和线程之间的通信练习

一、使用有名管道完成两个进程的相互通信(提示&#xff1a;可以使用多进程或多线程完成)。 代码1&#xff1a;创建两个有名管道文件 #include<myhead.h>int main(int argc, const char *argv[]) {if(mkfifo("./mingtohua",0664)-1)//创建小明向小华发信息的管…