代码随想录算法训练营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.mzph.cn/news/681877.shtml

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

相关文章

操作系统——1.1 操作系统的基本概念1.2 操作系统发展历程

参考课程是王道上传到b站的操作系统&#xff0c;主讲老师是咸鱼&#xff0c;相关的截图都是课程内的&#xff0c;阅读前建议大家支持王道的正版课程。 第一章 计算机系统概述 1.1 操作系统的基本概念&1.2 操作系统发展历程 一、概念 操作系统的概念 操作系统的功能和目…

学习总结11

KMP算法 全称Knuth-Morris-Pratt算法&#xff0c;是一种字符串匹配算法。该算法的目的是在一个文本串S内查找一个模式串P的出现位置。 KMP算法的核心思想是利用模式串自身的特性来避免不必要的字符比较。算法通过构建一个部分匹配表&#xff08;也称为next数组&#xff09;&a…

概率在AI中的应用

更多AI技术入门知识与工具使用请看下面链接&#xff1a; https://student-api.iyincaishijiao.com/t/iNSVmUE8/

VUE学习——表单的输入绑定

使用【v-model】。 输入框 <template><h1>表单输入绑定</h1><input type"text" v-model"message"><p>输入的值&#xff1a;{{ message }}</p> </template> <script>export default{data(){return{messa…

快速的搭建一个临时的 Linux 系统instantbox

centos 安装 docker-CSDN博客 首先要有docker && docker-compose mkdir instantbox && cd $_ bash <(curl -sSL https://raw.githubusercontent.com/instantbox/instantbox/master/init.sh) docker-compose up -d instantbox: instantbox 可以让你快速的搭…

黑马程序员——移动Web——day01

目录&#xff1a; 平面转换 简介平移定位居中案例-双开门旋转转换原点案例-时钟多重转换缩放案例-播放特效倾斜渐变 线性渐变案例-产品展示径向渐变综合案例 导航-频道渐变按钮轮播图猜你喜欢 1.平面转换 简介 作用&#xff1a;为元素添加动态效果&#xff0c;一般与过渡配…

GEE重投影——NICFI数据集重投影到WGS84坐标

简介 重投影 遥感影像的重投影是将一幅影像从一个地理坐标系统转换到另一个地理坐标系统的过程。在遥感应用中,重投影非常重要,因为不同的遥感影像可能来自于不同的遥感传感器或不同的地理坐标系统,而在进行数据分析和集成时,需要保证所有影像在同一地理坐标系统下。 重…

(二)【Jmeter】专栏实战项目靶场drupal部署

该专栏后续实战示例&#xff0c;都以该篇部署的项目展开操作。 前置条件 参考“&#xff08;一&#xff09;【Jmeter】JDK及Jmeter的安装部署及简单配置” 安装部署Jmeter&#xff0c;从文章最后下载“Postman、Rancher.ova、VirtualBox-7.0.12-159484-Win.exe、Xshell-7.0.01…

小白学习Halcon100例:如何利用动态阈值分割图像进行PCB印刷缺陷检测?

文章目录 *读入图片*关闭所有窗口*获取图片尺寸*根据图片尺寸打开一个窗口*在窗口中显示图片* 缺陷检测开始 ...*1.开运算 使用选定的遮罩执行灰度值开运算。*2.闭运算 使用选定的遮罩执行灰度值关闭运算*3.动态阈值分割 使用局部阈值分割图像显示结果*显示原图*设置颜色为红色…

ARMv8-AArch64 的异常处理模型详解之异常处理概述Handling exceptions

异常处理模型详解之异常处理概述 一&#xff0c;异常处理相关概念二&#xff0c;异常处理概述 一&#xff0c;异常处理相关概念 在介绍异常处理之前&#xff0c;有必要了解一些关于异常处理状态的术语&#xff1a; 当处理器响应一个异常时&#xff0c;我们称该异常被获取了&a…

PIL Image 使用详解

文章目录 1. 各种图像处理库介绍1.1 读取数据的通道顺序1.2 Python图像处理库&#xff08;PIL、Pillow、Scikit-image、Opencv&#xff09; 2、PIL库与Pillow库的区别3 Pillow库3.1 Pillow库特点3.2 Pillow库安装 4、Pillow的Image对象&#xff08;PIL.Image&#xff09;4.1 Im…

Peter算法小课堂—区间模型(2)

上次咋们讲了前两个区间模型&#xff1a;1.最大不重叠区间数 2.不重叠区间最少分组数。今天我们就学习&#xff1a;最小区间覆盖问题、区间重叠最厚层数&#xff01; 最小区间覆盖 先看三道题 那么&#xff0c;第1题&#xff0c;它是浮点数的题&#xff0c;也就要求首尾相同。…

知识图谱 多模态学习 2024 最新综述

知识图谱遇见多模态学习&#xff1a;综述 论文题目&#xff1a;Knowledge Graphs Meet Multi-Modal Learning: A Comprehensive Survey 论文链接&#xff1a;http://arxiv.org/abs/2402.05391 项目地址&#xff1a;https://github.com/zjukg/KG-MM-Survey 备注&#xff1a;55…

Unresolved reference: kotlinx 和 Unresolved reference:xxx

Unresolved reference: kotlinx 这个报错是因为build.gradle中忘记apply plugin了 apply plugin: kotlin-android-extensions如下 同步以后再次编译发现报错 Unresolved reference:xxx 是因为用于使用 Gradle 构建的 Kotlin 版本与 IDE 插件中的版本不一样的原因 解决方法 …

剪辑视频衔接怎么操作 剪辑视频衔接过渡自然方法 剪辑视频教程新手入门 抖音剪辑短视频 会声会影视频制作教程

视频剪辑在现代社交媒体和数字媒体时代中变得越来越重要。它广泛应用于各种领域&#xff0c;包括电影制作、广告宣传、教育培训、社交媒体内容创作等。 一、剪辑视频衔接怎么操作 会声会影是一款功能强大、易于使用的视频编辑软件。接下来我们拿会声会影为例讲解剪辑视频如何…

二叉树的垂直遍历

1.题目 这道题是2024-2-13的签到题&#xff0c;题目难度为困难。 考察的知识点是DFS算法和自定义排序。 题目链接&#xff1a;二叉树的垂直遍历 给你二叉树的根结点 root &#xff0c;请你设计算法计算二叉树的 垂序遍历 序列。 对位于 (row, col) 的每个结点而言&#xff…

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

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

C++ matplotlib 画图 Linux

Matplotlib-cpp画图 命令行下载matplotlibcpp git clone https://github.com/lava/matplotlib-cpp将matplotlibcpp.h移动到自己所用的工程 CMakeList.txt文件如下所示 cmake_minimum_required(VERSION 3.0.2) project(huatu)set(CMAKE_CXX_STANDARD 11)file(GLOB_RECURSE P…

生成树(习题)

模板】最小生成树 生成树有两种方法&#xff0c;但是我只会克鲁斯卡尔算法&#xff0c;所以接下来下面的的题目都是按照这个算法来实现的&#xff0c;首先来见一下生么是这个算法&#xff0c;在之前的我写的一篇博客中有题使叫修复公路&#xff0c;其实这一题就是使用了这个算…

Redis相关介绍

概念 Redis&#xff1a;非关系型数据库&#xff08;non-relational)&#xff0c;Mysql是关系型数据库(RDBMS) Redis是当今非常流行的基于KV结构的作为Cache使用的NoSQL数据库 为什么使用NoSQL 关系型 数据库无法应对每秒上万次 的读写请求 表中的存储记录 数量有限 无法简单…