回溯的相关题目,有点难度。

1.力扣216(组合III)

本题基于昨天的组合问题,只是把终止条件进行了改变,当数组长度为长度为k时,并且和为n时才将路径存进结果集中,其他步骤和上个题一样。

    List<List<Integer>> res =new ArrayList();LinkedList<Integer> path = new LinkedList();int sum=0;public List<List<Integer>> combinationSum3(int k, int n) {combination(k,n,1);return res;}public void combination(int k, int n,int startIndex) {if(path.size()==k&&sum==n){res.add(new ArrayList(path));return;}for(int i=startIndex;i<=9;i++){path.add(i);sum+=i;combination(k,n,i+1);path.removeLast();sum-=i;}}

2.力扣17(电话号码的组合)

本题我们先使用numString数组来存储每个数字代码的字母,digits存储的是待遍历输入的元素,我们在定义一个sum来记录遍历的深度,numString【digits【sum】-‘0’】来取出代表的元素,然后我们利用回溯的模板进行编写,有一点需要改进,也就是我们直接创建个StringBuilder来动态存储字符串,这样节省空间。下面是回溯三部曲:

  • 确定回溯函数参数:首先需要一个可变字符串temp来收集叶子节点的结果,然后用一个集合res保存起来,这两个变量依然定义为全局。这个sum是记录遍历第几个数字了,就是用来遍历digits的(题目中给出数字字符串),同时sum也表示树的深度。
    public void letter(String digits,String[] numString,int sum)
  • 确定终止条件:例如输入用例"23",两个数字,那么根节点往下递归两层就可以了,叶子节点就是要收集的结果集。那么终止条件就是如果index 等于 输入的数字个数(digits.size)了(本来sum就是用来遍历digits的),然后收集结果,结束本层递归。
        if(sum==digits.length()){res.add(temp.toString());return;}
  • 确定单层遍历逻辑:首先要取sum指向的数字,并找到对应的字符集(手机键盘的字符集)。
        String str = numString[digits.charAt(sum)-'0'];  for(int i=0;i<str.length();i++){temp.append(str.charAt(i));letter(digits,numString,sum+1);temp.deleteCharAt(temp.length()-1);}

整体代码:

    List<String> res =new ArrayList();StringBuilder temp = new StringBuilder();public List<String> letterCombinations(String digits) {if(digits==null||digits.length()==0){return res;}String[] numString = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};      letter(digits,numString,0);return res;}public void letter(String digits,String[] numString,int sum) {if(sum==digits.length()){res.add(temp.toString());return;}String str = numString[digits.charAt(sum)-'0'];  for(int i=0;i<str.length();i++){temp.append(str.charAt(i));letter(digits,numString,sum+1);temp.deleteCharAt(temp.length()-1);}}

day21组合III电话号码的字母组合相关推荐

  1. 代码随想录第二十五天|组合、电话号码的字母组合

    代码随想录第二十五天|216.17不熟 Leetcode 216. 组合总和 III Leetcode 17. 电话号码的字母组合 Leetcode 216. 组合总和 III 题目链接: 组合总和 ...

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

    216.组合总和III 找出所有相加之和为 n 的 k 个数的组合,且满足下列条件: 只使用数字1到9 每个数字 最多使用一次 返回所有可能的有效组合的列表 .该列表不能包含相同的组合两次,组合可以以 ...

  3. 算法训练Day25 | LeetCode216. 组合总和III(和77.组合很像!);LeetCode17. 电话号码的字母组合(不同集合中组合)

    目录 LeetCode216. 组合总和III 1. 思路 2. 代码实现 3. 剪枝 4. 复杂度分析 5. 思考与收获 LeetCode17. 电话号码的字母组合 1. 思路 2. 代码实现 3. ...

  4. Day25|组合板子|216. 组合总和 III| 17. 电话号码的字母组合

    组合板子+剪枝 216. 组合总和 III 剪枝操作? 17. 电话号码的字母组合 216. 组合总和 III class Solution {private:vector<int>tem ...

  5. Day25——组合总和III、电话号码的字母组合

    第25天,终于赶上进度了. 目录 前言 平静的湖面只有呆板的倒映,奔腾的激流才有美丽的浪花.幸福不是靠别人来布施,而是要自己去赢取.生命的意义在不断挑战自己,战胜自己! 一.组合总和III 二.电话号 ...

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

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

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

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

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

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

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

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

最新文章

  1. Android 改变窗口标题栏的布局
  2. JAVA连接数据库使用的API是什么呢,如何使用JDBC API在Java中建立数据库连接?
  3. 成为优秀程序员应该具备的8个特质
  4. 天地图专题四:在天地图上显示运行轨迹
  5. 计算机不能上网 检查路线,腾达(Tenda)路由器不能上网的解决方法
  6. hdu 4313 Matrix 并查集 多校联合赛(二) 第四题
  7. Prototype实例代码推荐
  8. html页面添加视频背景设置为自动播放,打开网址就会自动播放,简单有效亲测
  9. pc机器人软件哪里买_买电脑,机器人仿真,3D建模软件,PLC程序,需要什么配置的电脑?...
  10. 【ESP8266+STM32】获取B站粉丝数,并在STM32屏上显示出来(物联网小项目)
  11. Arthas结合Spring容器 线上排查Tips
  12. php实现飘窗,装配式飘窗的制作方法
  13. ImageDataGenerator.flow_from_directory(...)
  14. BZOJ 3262: 陌上花开 (CDQ分治)
  15. mysql sql文件分割_怎么将sql数据库文件分割
  16. 记人生第一次参加Codeforces比赛
  17. 谈Objective-C Block的实现(转载唐巧)
  18. 请善待,那些舍得借钱给你们的人!
  19. The error occurred while setting parameters,Communications The error may involve defaultParameterMap
  20. Classic BADI总结

热门文章

  1. 编写一个抽象类Shape,声明计算图形面积的抽象方法。再分别定义Shape的子类Circle(圆)和Rectangle(矩形),在两个子类中按照不同图形的面积计算公式,实现Shape类中计算面积的方法
  2. 机电一体化基础知识及实训QY-JDYT01
  3. PostgreSQL的学习心得和知识总结(八十九)|深入理解PostgreSQL数据库开源MPP扩展Citus再平衡函数rebalance_table_shards的实现原理
  4. 宝塔防火墙可以防ddos攻击吗
  5. StreamX 在 Joyme 的生产实践,从遇见到相爱一气呵成
  6. ChatGPT 爆火,社交应用如何 Get 新技能
  7. 解决[“usingcomponents“][“van-button“]: “@vant/weapp/button/index“ 未找到:
  8. linux oracle 失败怎么办,Linux开机报错unable to load selinux policy怎么办?
  9. Vue:前端体系与前后端分离
  10. 叶胜超:跨链双雄之Cosmos(宇宙)