day25 组合总和Ⅲ 电话号码的字母组合

题目1:216 组合总和Ⅲ

题目链接:216 组合总和Ⅲ

题意

找出相加之和为n的k个数的组合   数字只可使用1~9之间的数(包括 1 9)且每个数字只能使用1遍

题目中有两个限制条件:1)k个数      2)k个数的和为n    所以最终满足条件一个的组合一定要先判断是k个数,然后再计算这k个数的和为n,只有这样才是

回溯

回溯三部曲:

1)参数和返回值

2)终止条件     叶子节点  和为n的 k个数放入数组中

3)单层递归逻辑

sum不是参数

代码

class Solution {
public:vector<int> path;vector<vector<int>> result;void backtracking(int k,int n,int startIndex){//终止条件int sum = 0;if(path.size()==k){for(int i=0;i<k;i++){sum += path[i];}if(sum==n){result.push_back(path);}return;}//单层搜索逻辑for(int i=startIndex;i<=9;i++){path.push_back(i);backtracking(k,n,i+1);path.pop_back();}}vector<vector<int>> combinationSum3(int k, int n) {backtracking(k,n,1);return result;}
};
Sum作为参数

伪代码

代码

class Solution {
public:vector<int> path;vector<vector<int>> result;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();}}vector<vector<int>> combinationSum3(int k, int n) {backtracking(n,k,0,1);return result;}
};
剪枝

剪枝1

剪枝2

代码

class Solution {
public:vector<int> path;vector<vector<int>> result;void backtracking(int targetSum,int k,int Sum,int startIndex){if(Sum>targetSum) return;//剪枝1 //终止条件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();}}vector<vector<int>> combinationSum3(int k, int n) {backtracking(n,k,0,1);return result;}
};
  • 时间复杂度: O(n * 2^n)
  • 空间复杂度: O(n)

题目2:17 电话号码的字母组合

题目链接:17 电话号码的字母组合

题意

字符串中仅包含2-9,每个数字代表的字母和电话按键相同,返回其能表示的所有的字母组合

操作两个集合

回溯

回溯三部曲:

1)参数和返回值

2)终止条件   叶子节点收获结果

3)单层递归逻辑

代码

class Solution {
public://数字与字符串映射  将数字下标对应到字母字符串  2->abcstring letterMap[10] = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};string path ;//存放单个结果vector<string> result;//存放结果集void backtracking(string& digits,int index){//这里注意& //终止条件  index遍历到最后一个数字之后 存放结果if(index==digits.size()){result.push_back(path);return;}//单层递归逻辑//取出digits数字字符串中的单个字符 并将该字符转换为数字int digit = digits[index] - '0';//将该数字映射为字符串string letter = letterMap[digit];for(int i=0;i<letter.size();i++){path.push_back(letter[i]);backtracking(digits,index+1);//递归  将下标往后移动一个,指向下一个数字path.pop_back();//回溯}}vector<string> letterCombinations(string digits) {path.clear();result.clear();//这里的result一定要clear 不然后面的测试用例""会报错if(digits.size()==0) return result;backtracking(digits,0);//从数字字符串中的第1个字符开始遍历return result;}
};
  • 时间复杂度: O(3^m * 4^n),其中 m 是对应四个字母的数字个数,n 是对应三个字母的数字个数
  • 空间复杂度: O(3^m * 4^n)

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

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

相关文章

Pandas.DataFrame.count() 非空单元格计数 详解 含代码 含测试数据集 随Pandas版本持续更新

关于Pandas版本&#xff1a; 本文基于 pandas2.1.2 编写。 关于本文内容更新&#xff1a; 随着pandas的stable版本更迭&#xff0c;本文持续更新&#xff0c;不断完善补充。 Pandas稳定版更新及变动内容整合专题&#xff1a; Pandas稳定版更新及变动迭持续更新。 Pandas API参…

Ansys Zemax | 如何使用光学制造全息图修正像差

附件下载 联系工作人员获取附件 本文介绍了利用光学全息图降低单透镜像差的方法。在描述了表示全息图构造光束的两个 ZMX 文件之后&#xff0c;本文演示了如何在重现文件中设置 OFH。然后解释了如何轻松地从重现文件中访问任何结构造光束变量&#xff0c;以实现衍射受限单透镜…

【数据结构】常见八大排序算法总结

目录 前言 1.直接插入排序 2.希尔排序 3.选择排序 4.堆排序 5.冒泡排序 6.快速排序 6.1Hoare版本 6.2挖坑法 6.3前后指针法 6.4快速排序的递归实现 6.5快速排序的非递归实现 7.归并排序 8.计数排序&#xff08;非比较排序&#xff09; 9.补充:基数排序 10.总结…

第八讲_ArkTS装饰器(五)

ArkTS装饰器&#xff08;五&#xff09; 1. Watch装饰器1.1 Watch装饰器的特点1.2 Watch装饰器使用示例 2. ArkTS装饰器总结 1. Watch装饰器 Watch用于对状态变量的监听。如果需要关注某个状态变量的值是否改变&#xff0c;可以使用Watch为状态变量设置回调函数。 何为状态变…

产品经理学习-用户运营和用户分层模型

目录什么是用户运营用户运营三大工作体系用户分层模型-AARRR介绍 什么是用户运营 定义&#xff1a;用户运营就是搭建用户运营体系&#xff0c;围绕用户来做一系列的产品运营机制&#xff0c;提升太湖的活跃和留存&#xff0c;最终让用户进行付费。 例如小红书就是建立了用户…

C++进阶--哈希表的的闭散列和开散列(哈希桶)实现

哈希表的的闭散列和开散列&#xff08;哈希桶&#xff09;实现 一、哈希概念二、哈希冲突三、哈希函数3.1 直接定址法--&#xff08;常用&#xff09;3.2 除留余数法--&#xff08;常用&#xff09;3.3 平方取中法--&#xff08;了解&#xff09;3.4 折叠法--&#xff08;了解&…

MT36291替代MT3608 FP6291 低成本 用于移动电源,蓝牙音箱,便携式设备等

航天民芯原装MT36291 SOT23-6 PIN对PIN替代FP6291LR-G1 MT3608等&#xff0c;低成本&#xff0c;用于移动电源&#xff0c;蓝牙音箱&#xff0c;便携式设备等领域。 TEL:18028786817 专注于电源管理IC 一级代理 技术支持 欢迎试样&#xff01; 描述 MT36291是一个恒定频…

VitePress-01-从零开始的项目创建(npm版)

说明 本文介绍一下 VitePress的项目创建的步骤。 主要用到的命令工具是 npm。 本文的操作步骤是从无到有的创建一个完整的基本的【VitePress】项目。 环境准备 根据官方文档的介绍&#xff0c;截止本文发稿时&#xff0c;需要使用node.js 18 的版本。 可以使用node -v 的命令查…

Forward(转发)和Redirect(重定向)的异同

Forward&#xff08;转发&#xff09;和Redirect&#xff08;重定向&#xff09;是两种不同的服务器端跳转机制&#xff0c;它们在Servlet中用于控制页面的跳转和处理请求的方式。 Forward&#xff08;转发&#xff09;&#xff1a; 特点&#xff1a; 转发是在服务器内部进行的…

LiteAD对接FusionCompute

2、FA发放云桌面并与FC对接 &#xff08;1&#xff09;创建虚拟机模板 &#xff08;2&#xff09;创建虚拟机命名规则 &#xff08;3&#xff09;创建虚拟机组 &#xff08;4&#xff09;创建桌面组 &#xff08;5&#xff09;创建域用户和组&#xff08;就相当于在Microsoft …

【Java 设计模式】创建型之建造者模式

文章目录 1. 定义2. 应用场景3. 代码实现4. 应用示例结语 在软件开发中&#xff0c;建造者模式是一种创建型设计模式&#xff0c;它将一个复杂对象的构建与其表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。建造者模式通常包括一个指导者&#xff08;Director&…

sfml使用opengl着色器实现2d水面波浪

SFML中使用GLSL着色器来绘制水波。 效果 代码 #include <SFML/Graphics.hpp> #include <iostream>int main() {const int WIDTH = 800;