组合板子+剪枝

  • 216. 组合总和 III
    • 剪枝操作?
    • 17. 电话号码的字母组合

216. 组合总和 III

class Solution {private:vector<int>temp;vector<vector<int>>result;//sum 存和,index为回溯提供下标void backtracking(int k,int n,int sum,int index){if(temp.size() == k)//判断一维数组的个数是否等于k{if(sum == n ) //等于所求值 存入,佛则返回上一层;{result.push_back(temp);}return; //如果不符合要求,返回上一层}for(int i=index;i<=9;i++)//无剪枝版(第一次1~9种情况){sum+=i;//和值改变temp.push_back(i);//存入ibacktracking(k,n,sum,i+1);//i+1让范围向后推1 例如2~9sum-=i;//回溯过程temp.pop_back();}}
public:vector<vector<int>> combinationSum3(int k, int n) {backtracking(k,n,0,1);return result;}
};

剪枝操作?

1.想想如果sum已经超过了,目标值但此时一维数组个数还没有达到k
我们直接return上一层!

2.如果我们不能让一维数组的个数到k,我们是不是直接把这个分支剪掉,避免非必要循环!

例如:我们要求 k=2,但是递归到 9已经没有意义!
k=3,我们递归到7就可以,{7.8.9}后面已经没有必要了去递归了,因为怎么递归都满足不了size=k;
所以怎么递归?
我们把9-(k-size)//假设k=2,第一次size=0所以9-(2-0)=7,我们要递归到8,所以9-(k-size)+1
假设k=3,9-(k-size)+1=7,第一次正好遍历到7
第二次size已经+1,则9-(k-size)+1=8,则8,同理下一次为9,所以遍历为{7,8,9}

class Solution {private:vector<int>temp;vector<vector<int>>result;//sum 存和,index为回溯提供下标void backtracking(int k,int n,int sum,int index){if(sum>n) return;if(temp.size() == k)//判断一维数组的个数是否等于k{if(sum == n ) //等于所求值 存入,佛则返回上一层;{result.push_back(temp);}return; //如果不符合要求,返回上一层}for(int i=index;i<=9-(k-temp.size())+1;i++)//无剪枝版(第一次1~9种情况){sum+=i;//和值改变temp.push_back(i);//存入ibacktracking(k,n,sum,i+1);//i+1让范围向后推1 例如2~9sum-=i;//回溯过程temp.pop_back();}}
public:vector<vector<int>> combinationSum3(int k, int n) {backtracking(k,n,0,1);return result;}
};

17. 电话号码的字母组合

class Solution {private:const string keys[10] = {"", // 0"", // 1"abc", // 2"def", // 3"ghi", // 4"jkl", // 5"mno", // 6"pqrs", // 7"tuv", // 8"wxyz", // 9};string s;vector<string>result;//index 无比重要,它是确定到输入字符串数组遍历到哪里了!//"23",index=0,说明是2,index=1,说明是3void backtarcking(const string &digits,int index){if( index == digits.size())//index在“23”情况不是到1就行了吗?我们在“23”后面进入下一次index已经等于2了,直接return!而且回溯正确{result.push_back(s);return;}int stand=digits[index]-'0';//index妙用,stand可以实现9键的按键string tempS=keys[stand];//对应按键字符串!for(int i=0;i<tempS.size();i++){s.push_back(tempS[i]);backtarcking(digits,index+1);//index+1,移动到“3”;s.pop_back();//回溯}}
public:vector<string> letterCombinations(string digits) {if(digits.size()==0)return result; backtarcking(digits,0);//index为1return result;}
};

Day25|组合板子|216. 组合总和 III| 17. 电话号码的字母组合相关推荐

  1. 代码随想录算法训练营第24天25天|● 77. 组合● 216.组合总和III ● 17.电话号码的字母组合

    77组合 看完题后的思路 void f(数组,startIndex) 递归终止 if(startIndex数组长度||path.sizek){ if(path.size==k){ 加入} } 递归 f ...

  2. day25|● 216.组合总和III ● 17.电话号码的字母组合

    day25 3.13 回溯第二天 216.组合总和III 链接: 216.组合总和III 思路:本题k相当于树的深度,9(因为整个集合就是9个数)就是树的宽度. class Solution {pri ...

  3. Day25 LeetCode 216. 组合总和 III 17. 电话号码的字母组合

    题目:216. 组合总和 III - 力扣(LeetCode) 思路: 1.递归函数参数和返回值:首先需要两个全局变量一维path数组和二维result数组,path数组用来收集路径上的元素,resu ...

  4. 攻克代码随想录Day25 | 216. 组合总和 III | 17. 电话号码的字母组合

    216. 组合总和 III 在该题中,题目的整体思路与之前的77. 组合思路是相似的.但在本体中,我选择从1-9遍历每一种可能性.然后将与k相等的组合进行判定,若之和与n相等,则将其push进去,否则 ...

  5. LeetCode 216组合总和III 17电话号码的字母组合

    文章目录 216组合总和III c++ 代码实现 python 代码实现 17.电话号码的字母组合 c++ 代码实现 python代码实现 216组合总和III 找出所有相加之和为 n 的 k 个数的 ...

  6. day29 | 216.组合总和III 17.电话号码的字母组合

    文章目录 216.组合总和III 1.代码(AC) 2.分析 17.电话号码的字母组合 1.代码 2.分析 216.组合总和III 1.代码(AC) class Solution {List<L ...

  7. 216.组合总和III 17.电话号码的字母组合

    216.组合总和III 回溯的常规思路做这道题: class Solution {List<List<Integer>> list = new ArrayList<> ...

  8. 代码随想录算法训练营第二十五天|216.组合总和III 17.电话号码的字母组合

    目录 LeeCode 216.组合总和III LeeCode 17.电话号码的字母组合 LeeCode 216.组合总和III 216. 组合总和 III - 力扣(LeetCode) 思路:本题和 ...

  9. 代码随想录第25天|216.组合总和III ● 17.电话号码的字母组合

    216.组合总和Ⅲ 回溯三部曲 确定递归函数参数 需要一维数组path来存放符合条件的结果,二维数组result来存放结果集. 接下来还需要如下参数: targetSum(int)目标和,也就是题目中 ...

最新文章

  1. Contos7 克隆实例 以及 配置网络-服务-等相关信息
  2. 201521123111《Java程序设计》第2周学习总结
  3. 如何为“选择”框创建占位符?
  4. C/C++ 之 C发展史及 各标准特性说明
  5. 复位 stm32_分析一个关于STM32 芯片异常复位的经典案例!
  6. html css实现登录注册页面,基于HTML5+css+JS_的精美登陆注册界面
  7. linux日志区别,你要了解的linux系统日志知识点都在这
  8. android获取各种系统路径的方法
  9. 春天:谁是最得意的诗人?
  10. const int * pi/int * const pi的区别
  11. Excel·VBA自定义函数扩展VLOOKUP
  12. C# Winfrom MQTT 客户端与服务器【代码】
  13. word转pdf实现,POIXMLDocumentPart.getPackageRelationship()Lorg...问题,以及NotOfficeXmlFileException...问题
  14. mac 修改vmware的NAT网关
  15. 计算机行业的最新技术,计算机行业发展空间巨大 三大必然趋势引领发展
  16. 网站歌曲播放器php,推荐漂亮的flash网页MP3音乐播放器
  17. 为什麽CMOS电路的输入端不准悬空,而TTL电路的输入端不准串接大电阻?
  18. unity检测范围内敌人_unity_小功能实现(敌人追踪主角)
  19. golang的图片操作:缩放图片+合成图片
  20. Lua学习笔记-OOP面向对象

热门文章

  1. Python——单线程与多线程
  2. python画函数图像-Python 绘制你想要的数学函数图形
  3. windows XP 安装Sql Server 2000企业管理器无法打开(MMC)的解决方法(亲试,可用)
  4. 红米4A全版本通刷_2016111 2016112_官方线刷包_救砖包_解账户锁
  5. Win11安卓子系统无法启动怎么办?安卓子系统启用虚拟机平台教程(确保在可选的Windows功能中启用虚拟机平台)
  6. 存储结构和磁盘划分(基于RedHat7)
  7. pytroch冻结某些层的常用方法
  8. Flutter列表ListView学习
  9. abl String方法
  10. 草图vr3.6许可证服务器安装失败,VRay3.6无法获得许可-200