面试热点题:回溯算法 电话号码的字母组合与组合总和
创始人
2025-05-31 05:09:18
0

前言:
如果你一点也不了解什么叫做回溯算法,那么推荐你看看这一篇回溯入门,让你快速了解回溯算法的基本原理及框架

电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

来源:力扣(LeetCode)电话号码的字母组合
在这里插入图片描述
在这里插入图片描述
思路:
从示例来看,我们首先能想到的最直接的思路就是循环套循环来组合输出,但是循环会根据输入的数字越来越多导致套的层次越多,这时候我们就可以考虑学习上一篇的思路,使用递归回溯的办法解决。

  • 解决数字与字母映射的关系:
    我们可以直接定义一个数组,下标对应其字母:
vector arr{ "","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz" };//写两个空串是为了能用下标直接对应九宫格里的字母
  • 画图举例
    我们以"234"来说明

在这里插入图片描述
下面我们来边写边解释:

class Solution {
public:vector arr{"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};vector _arr;//收集所有子集string tmp;//存储子集void BackTracking(string digits,int k)//k是记录遍历到第几个数字{if(tmp.size()==digits.size())//终止条件{_arr.push_back(tmp);//存放子集到总集合return;}//digits[k]-'0'是将数字字符改成数字//arr[digits[k]-'0']访问数字字符对应下标位置的字符串for(int i=0;itmp.push_back(arr[digits[k]-'0'][i]);//收集字符BackTracking(digits,k+1);//递归,k+1为下一次进入的字符串tmp.pop_back();//回溯,撤销节点}}vector letterCombinations(string digits) {if(digits.size()==0){return _arr;}BackTracking(digits,0);return _arr;}
};

组合总和

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。

candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。

对于给定的输入,保证和为 target 的不同组合数少于 150 个。

来源:力扣(LeetCode)组合总和

在这里插入图片描述
思路:
本题的主要关键信息是:所有数字不相同且可以无限制使用,组合与组合不相同,提示中已经表明不会出现0,所以我们直接忽略0带来的结果。

  • 我们以示例2来[2,3,5]画图:

在这里插入图片描述
我们将candidates为升序排列,
由于数字的数量不做限制,我们每次for循环开始的位置就可以是上次循环变量i所在的位置,而递归的深度限制就是总和达到target或者大于它的时候

下面我们边写边解释:

class Solution {
public:vector> arr;//收集符合条件子集vector _arr;//存放单个子集//sum为_arr子集的总和数 begin为循环开始位置void BackTracking(vector& candidates,int target,int sum,int begin){if(sum>target)//终止条件{return;}if(sum==target){arr.push_back(_arr);return;}for(int i=begin;isum+=candidates[i];//递加总和_arr.push_back(candidates[i]);//存放至子集BackTracking(candidates,target,sum,i);//i不加1 表示可以重复取该数sum-=candidates[i];//回溯,撤销上一次的运算_arr.pop_back();//回溯,撤销上一次的运算}}vector> combinationSum(vector& candidates, int target) {sort(candidates.begin(),candidates.end());//先排序,后续更好优化BackTracking(candidates,target,0,0);return arr;}
};

剪枝优化

在这里插入图片描述

优化后的代码:

class Solution {
public:vector> arr;vector _arr;void BackTracking(vector& candidates,int target,int sum,int begin){if(sum==target){arr.push_back(_arr);return;}//如果sum+candidates[i]>target遍历可以停止了for(int i=begin;isum+=candidates[i];_arr.push_back(candidates[i]);BackTracking(candidates,target,sum,i);sum-=candidates[i];_arr.pop_back();}}vector> combinationSum(vector& candidates, int target) {sort(candidates.begin(),candidates.end());BackTracking(candidates,target,0,0);return arr;}
};

这个题相较与回溯入门中的两个组合总和题
主要区别是没有组合里元素数量限制单个元素数量限制

相关内容

热门资讯

数字经济转型之下医院信息化平台... 3月11日,由东南大学附属中大医院信息中心主办的智慧健康新江苏交流会在南京顺利举行。 ...
东方联盟揭示了 CatB 勒索... 据观察,CatB 勒索软件操作背后的威胁行为者使用一种称为DLL 搜索顺序劫持的技术来...
我的1919观后感1000字 ...  【篇一】  前些天,班里同学一同观看了影片《我的1919》,这部影片讲述的是在第一次世界大战末,属...
最新或2023(历届)活着观后...  【篇一】  不去品尝生活的苦就不会懂得幸福的真谛。从古至今,有谁没有遭遇过挫折,又有谁没有过不幸的...
三傻大闹宝莱坞观后感1000字...  【篇一】  《三傻大闹宝莱坞》,起初刚听到这部电影的名字的时候,我感觉这无非就是一部搞笑的电影。但...
最新或2023(历届)心灵捕手...   一部名叫《最强大脑》的节目,使“雨人”一词再次走向人们的视野。而心理题材的电影,也历来备受影迷追...
毕业qq女生忧伤说说签名带图片... qq女生忧伤说说带图片 六组女生忧伤带图片的说说~~如果您喜欢本文请分享给您的好友~~我从来不...
YOLOv5网络结构,训练策略... 前言 前面已经讲过了Yolov5模型目标检测和分类模型训练流程,这一篇讲解一下yolo...
最新或2023(历届)作文千手...  【篇一】  21个聋哑人,她们在舞台上尽情挥洒,她们在残缺中追求完美,在无声中激荡生命。她们在娇媚...
[SwiftUI]GroupB... 代码: import SwiftUIstruct MPMineView: View {...
甲午大海战观后感2000字 甲...   【篇一】  坐在电脑前看《一八九四·甲午大海战》时,我是怀着十分忐忑的心情的,因为已经预知那段清...
风雨哈佛路观后感500字 风雨...   【篇一】  这部电影我看了很受触动,女主人公经历了常人不敢想象的成长道路,最终实现了梦想,走进了...
最新或2023(历届)感动中国...  【篇一】  "感动你我,感动中国,这世界有爱才转动。感动你我,感动中国,这世界有爱才永恒。"当《感...
历史文献纪录片信仰观后感 历史... 【篇一】  曾经,在念大学的时候,"信仰"对我而言是很空、很大,虚无缥缈,是个看不见、摸不着的东西。...
【ACL】访问控制列表 文章目录1.访问控制列表1.1 ACL概述1.2 ACL在接口的应用方向2.ACL的工作原理2.1 ...
优秀班主任主要事迹10篇汇总 ... 篇一:  本人自2009年参加工作以来,一直担任班主任工作,本人在班级管理、教学和德育工作方面均表现...
最新或2023(历届)初中模范... 篇一:优秀班主任先进事迹材料  我从事教育教学工作二十一年了,多年来,我和广大教师一样,热爱教育事业...
最新或2023(历届)县优秀班...   爱岗敬业呕心化春雨 倾情撑蓝天  记玉龙县优秀教师 xxx  xxx,女,纳西族,xxx年xx月...
最新或2023(历届)优秀班主...   篇一:优秀班主任先进事迹  ***,男,汉族,1973年8月出生于安徽明光市,现为经济管理学院综...
电影南京南京观后感大全 关于电...  【篇一】  5.1号走进莱蒙的东方国际影城观看这部期待了很久的电影南京南京,一定要去看这个片子原因...