当前位置: 首页 > news >正文

day 22

day 22|77. 组合 216.组合总和III 17.电话号码的字母组合

基础知识:

回溯套路模板:

void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯,撤销处理结果}
}

回溯本质上是一个暴力解法。

可以解决的问题包括:

  • 组合问题:N个数里面按一定规则找出k个数的集合
  • 切割问题:一个字符串按一定规则有几种切割方式
  • 子集问题:一个N个数的集合里有多少符合条件的子集
  • 排列问题:N个数按一定规则全排列,有几种排列方式
  • 棋盘问题:N皇后,解数独等等

回溯问题可以抽象为树形结构

77. 组合

第77题. 组合 | 代码随想录

笔记

链接里讲的非常好。这里标注一下重要的点:

1.组合问题是没有顺序的,所以需要防止结果数组重复,所以程序中严格控制循环的起始位置(startindex

2.for循环是用来横向遍历的,即从几个数中选择一个数放进一维数组path中;递归是用来纵向遍历的,即从选择后剩下的数中进一步操作。

剪枝操作:

每一次循环的终止点就是保证剩下内容中能够找到n个数,即 n - (k - path.size()) + 1

实操出现问题

向下一层递归的时候应该是当前起始点startindex后一个,所以应该是i+1

代码/比较

class Solution {
private:vector<int> path;vector<vector<int>> result;void backtrack(int n,int k,int startindex){//截止条件:if(path.size()==k){result.push_back(path);return;}//单层逻辑:for(int i=startindex;i<=n-(k-path.size())+1;i++){path.push_back(i);backtrack(n,k,i+1);path.pop_back();}return;}
public:vector<vector<int>> combine(int n, int k) {backtrack(n,k,1);return result;}
};

216.组合总和III

笔记:

与上一个题目的不同点就在于要多一层判断总和的操作。总体代码差不多,同一种套路。

本题目涉及到的剪枝操作除了上一题中的那个条件外,还多了一个当前和大于目标和的剪枝操作。

代码:

class Solution {
private:vector<int> path;vector<vector<int>> result;void backtracking(int k,int n,int startindex,int sum)//n为目标和{//剪枝操作:如果当前和已经大于目标和了,直接退出if(sum>n)return ;//截止条件:如果path中个数相同,并且当前和与目标和相同if(path.size()==k){if(sum==n) result.push_back(path);   return ;}//单层递归:for(int i=startindex;i<=9-(k-path.size())+1;i++){path.push_back(i);backtracking(k,n,i+1,sum+i);path.pop_back();}return;}
public:vector<vector<int>> combinationSum3(int k, int n) {backtracking(k,n,1,0);return result;}
};

17.电话号码的字母组合

17.电话号码的字母组合 | 代码随想录

笔记:

​ 画树状图是非常有用的,怎么把这个问题转化为树状图?很显然,这个问题和上面两个问题是不同的,因为他是在不同集合里面取一个char,所以我们画树状图的时候,每一层的内容是不一样的,每一层的内容是不同数字对应的string,这样就可以画出本题的树状图了。

​ 再回看树状图,事实上本题唯一的区别也就是每一层取的内容不一样,这就是唯一的区别了,再按照套路代码想下来就好。

实操出现问题:

对字符串的操作还是有很多不熟悉的地方:

1.不能在类内使用圆括号初始化,这样编译器会不清楚这是成员变量声明还是成员函数声明。应该使用花括号初始化;

2.字符型变量转为int:int num = digits[i] - '0';

代码:

class Solution {
private:vector<string> m_string = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};vector<string> result;string path;void backtracking(vector<int> digits,int startindex){//截止条件:如果path.size()和想要长度相同了,将path放入result中if(path.size()==digits.size()){result.push_back(path);return;}//迭代逻辑:string phone=m_string[digits[startindex]];for(int i=0;i<phone.size();i++){path+=phone[i];backtracking(digits,startindex+1);path.pop_back();}return ;}
public:vector<string> letterCombinations(string digits) {vector<int> digits_num;//转换为intfor(int i=0;i<digits.size();i++){int num=digits[i]-'0';digits_num.push_back(num); }backtracking(digits_num,0);return result;}
};

1

http://www.jsqmd.com/news/346242/

相关文章:

  • 2026年盘扣脚手架厂家权威推荐:防腐/镀锌/重型/移动/建筑盘扣脚手架源头厂家精选 - 品牌推荐官
  • 在ROS2上运行ORB-SLAM3报错Error: “double free or corruption (out)”
  • 2026年面膜品牌推荐:北京易颜堂生物科技有限公司,多款修护补水面膜满足不同肤质需求 - 品牌推荐官
  • HoloOcean水下机器人模拟器:从1.0到2.0的重大升级
  • 全屋定制如何选择封边机? - 星辉数控
  • 2026年卧式螺旋离心设备厂家推荐:浙江中润环保工程有限公司全系卧螺离心机解决方案 - 品牌推荐官
  • 2026年叛逆孩子教育机构推荐:湖北宏志达青少年心理咨询有限公司,专业矫正叛逆行为 - 品牌推荐官
  • 液压机械手plc s7-1200 博图v15.1 以镗孔专用机床加工零件的上料、下料为例,机械...
  • 2026年祛痘祛斑加盟推荐:蚌埠颜胜玉美容服务有限公司,祛斑产品招商与加盟优选方案 - 品牌推荐官
  • 短效代理IP有哪些使用场景?
  • 自适应阻抗控制仿真程序与迭代自适应控制实现
  • 2026年AI摄影培训学校哪家强?五大优质院校助力影像职业进阶 - 深度智识库
  • 2026年2月成都给水管、拉齐管、钢丝骨架管、钢带波纹管、双壁波纹管厂家哪家好 - 2026年企业推荐榜
  • 2026广州商务娱乐场所推荐:穗金夜总会/穗金俱乐部/穗金KTV/穗金Party全场景覆盖 - 品牌推荐官
  • 2026年香港公司服务推荐:珠海市生易商务提供公证/审计/记账/商标/注册等一站式服务 - 品牌推荐官
  • 如何选择元素分析仪专用锡箔片?关键性能指标与靠谱供应商推荐 - 品牌推荐大师
  • 2026年2月江苏曝气器/废气焚烧炉公司推荐:技术迭代期,选对伙伴决胜未来 - 2026年企业推荐榜
  • 2026涿州装修服务推荐:松然装饰一站式全包/半包/奶油风/loft/别墅装修设计全解析 - 品牌推荐官
  • 冥想第一千七百八十五天(1785)
  • 虎贲等考 AI:以 AI 重构学术创作,全流程赋能论文写作新范式
  • 建议收藏|千笔·专业论文写作工具,最受欢迎的一键生成论文工具
  • 写论文软件哪个好?虎贲等考 AI 凭全流程赋能,碾压传统工具
  • 云蝠智能外呼系统的核心优势:全栈自研技术架构深度解析
  • 决策陷阱:混淆平均与边际,汤姆该让多少艘渔船出海?
  • 9 款 AI 写论文哪个好?实测后这款毕业论文神器凭硬实力出圈
  • Python毕设选题推荐:基于python+flask框架的在线教学网站基于Python+Flask的在线教育平台的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • vue+springboot基于微信平台的定位考勤的设计与实践开题报告
  • 闭眼入!继续教育论文神器 —— 千笔·专业论文写作工具
  • A实验:动物行为学整体解决方案 资料说明
  • 5 款 AI 写论文哪个好?实测封神!虎贲等考 AI 凭 “真材实料” 碾压同类