代码随想录算法训练营Day25|回溯算法·组合总和III,电话号码的字母组合

组合总和III

题目:找出所有相加之和为n的k个数的组合。组合中只允许含有1-9的正整数,并且每种组合中不存在重复的数字。

组合变量个数为k个,和为n。简单思路是使用k重循环,一层层找出来,然后把每一层的数相加,等于n就把这个组合找出来,输出。但是n重……无从满足,就要想到用回溯暴力。

组合不强调顺序,元素重复的组合看作一个。

组合内元素不重复。

画树,k是深度,n是宽度。

class Solution{
private:vector<vector<int>>result;//存放结果集vector<int>path;//符合条件的结果void backtracking(int targetSum, int k, int sum, 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, k, sum, i + 1);sum -= i;//回溯path.pop_back();//回溯}}public:vector<vector<int>>combinationSum3(int k,int n){result.clear();//可以不加path.clear();backtracking(n, k, 0, 1);return result;}
};

剪去元素总和超过和n的,剪枝的地方可以放在递归函数开始的地方,

if(sum > targetSum){//剪枝操作
return;
}

或者把剪枝放在调用递归之前,但是要记得先回溯。

for(int i = startIndex; i <= 9 - (k - path.size()) + 1; i++){//剪枝
sum += i;//处理
path.push_back(i);//处理
if(sum > targetSum){//剪枝sum -= i;//回溯path.pop_back();//回溯return;
}
backtracking(targetSum, k, sum, i + 1);//注意i+1调整startIndex
sum -= i;//回溯
path.pop_back();//回溯
}

定义一维数组path

二维数组,放结果集

确定递归函数返回值,确定终止条件,确定单层搜索的逻辑 

class Solution{
private:vector<vector<int>>result;vector<int>path;void backtracking(int targetSum, int k, int sum, 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, k, sum, i + 1);sum -= i;path.pop_back();}}public:vector<vector<int>>combinationSum3(int k. int n){result.clear();path.clear();backtracking(n, k, 0, 1);return result;}
};

电话号码

题目:

数字2——9,对应字母如上,输入两个数字,找出所有可能字母组合。

思路:

1.用map或定义一个二维数组,进行数字和字母之间的映射。

2.一个组合有两个字母,用双层for循环……n重for循环,用回溯算法

3.输入其他键(2-9以外)的异常情况

回溯>>

横向由for循环控制,纵向深度用递归控制.

回溯三部曲:

1.回溯函数参数,题目给定的string digits,int 型的index记录遍历到第几个数字了,就是用来遍历digits的(digits题目给定的数字字符串),同时index也表示树的深度。

vector<string>result;
string s;
void backtracking(const string& digits,int index)

2.确定终止条件

如果index等于输入的数字个数(digits.size),举例输入的“23”,深度就2,每次递归,遍历两次就可以。

if(index == digits.size()){
result.push_back(s);
return;
}

 3.确定单层遍历的逻辑

首先要取index指向的数字,找到对应的字符集。

然后for循环处理

int digit = digits[index]-'0';//将index对应的数字转化为int型
string letters = letterMap[digit];//取数字对应的字符集
for(int i = 0;i < letters.size();i++){s.push_back(letters[i]);//处理,将i对应的字符添加到s末尾backtracking(digits,index + 1);//递归,注意index+1,进入下一层,处理下一个数字s.pop_back();//回溯
}

完整: 

class Solution {
private:const string letterMap[10] = {//用MAP定义一个二维数组,用来做映射"",//0"",//1"abc",//2"def",//3"ghi",//4"jkl","mno","pqrs","tuv","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';//将index指向的数字转化为intstring 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;}
};

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【RL】Bellman Optimality Equation(贝尔曼最优等式)

Lecture3: Optimal Policy and Bellman Optimality Equation Definition of optimal policy state value可以被用来去评估policy的好坏&#xff0c;如果&#xff1a; v π 1 ( s ) ≥ v π 2 ( s ) for all s ∈ S v_{\pi_1}(s) \ge v_{\pi_2}(s) \;\;\;\;\; \text{for all…

c++Qt网络操作

1、基础概念 1.1 TCP/UDP TCP 是一种面向连接的传输层协议&#xff0c;它能提供高可靠性通信(即数据无误、数据无丢失、 数据无失序、数据无重复到达的通信) 适用情况&#xff1a; 1.SN/QQ等即时通讯软件的用户登录账户管理相关的功能通常采用TCP协议 2、适合于对传输质量要求较…

力扣hot1--哈希

推荐一个博客&#xff1a; 一文看懂哈希表并学会使用C STL 中的哈希表_哈希表end函数-CSDN博客 哈希做法&#xff1a; 我们将nums[i]记为key&#xff0c;将i记为value。 判断target-nums[i]是否在哈希表中&#xff0c;如果在说明这两个值之和为target&#xff0c;那么返回这两…

AI绘画作品的展示和变现-2

4.7 制作红包封面 中国的节日和传统文化元素仍然可以成为创作者们的创作灵感&#xff0c;创造出更多的变现机会。比如元宵节&#xff0c;可以制作大型元宵图案&#xff0c;进行引流并卖出元宵。 而春分、谷雨等节气也可以成为创作的灵感来源&#xff0c;创作出与之相关的图案&…

每日一题——数字翻转

题目; 这道题看似是很简单的回文数 实则就是很简单的回文数 但是需要注意的一点是负数 可以在开头就进行判断&#xff0c;如果N<0的话就令N-N&#xff0c;将所有数都转成正数就好办了 上代码&#xff1a; #include <iostream> #include<string> #include<…

LeetCode Python - 15.三数之和

目录 题目答案运行结果 题目 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可…

ELAdmin 部署

后端部署 按需修改 application-prod.yml 例如验证码方式、登录状态到期时间等等。 修改完成后打好 Jar 包 执行完成后会生成最终可执行的 jar。JPA版本是 2.6&#xff0c;MyBatis 版本是 1.1。 启动命令 nohup java -jar eladmin-system-2.6.jar --spring.profiles.active…

书生浦语大模型实战营-课程笔记(1)

模型应用过程&#xff0c;大致还是了解的。和之前实习做CV项目的时候比起来&#xff0c;多了智能体这个环节。智能体是个啥&#xff1f; 类似上张图&#xff0c;智能体不太清楚。感觉是偏应用而不是模型的东西&#xff1f; 数据集类型很多&#xff0c;有文本/图片/视频。所以…

Autosar Can模块介绍

简单介绍下&#xff0c;CAN控制器模块处于MCAL,为控制抽象层&#xff0c;这部分主要配置can外设的时钟、波特率、过滤器和邮箱&#xff0c;因芯片的不同&#xff0c;可能会增加一些新的配置项。需要解释下&#xff0c;什么是邮箱&#xff0c;邮箱就是一片报文缓存空间&#xff…

代码随想录day22--回溯的应用1

LeetCode216.组合总和III 题目描述&#xff1a; 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺序返回。…

C语言每日一题(56)平衡二叉树

力扣网 110 平衡二叉树 题目描述 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,…

HotCoin Global: 澳洲双牌照持有平台,坚守全球合规之路

前言&#xff1a; 加密交易平台的合规性不仅是相关法规遵守的问题&#xff0c;更是市场透明度和用户公平性的关键。为促使加密市场的交易活动有规范、有秩序地进行&#xff0c;确保加密投资者的资产与交易安全&#xff0c;部分国家明确对加密资产的交易和经营活动进行监督及管…