代码随想录算法训练营Day22|77、组合216、组合综合17、电话号码的字母组合 ...

打印 上一主题 下一主题

主题 860|帖子 860|积分 2580

77、组合

        回溯三部曲:1、确定函数头 2、确定停止条件 3、确定单层逻辑(for循环横向遍历,遍历的时候把递归看成一个黑盒)
        for循环控制的是当前层的逐个元素遍历,递归层的i+1控制的是下一层从这个元素的下一个开始取,如果可以取重复元素的话,下一层依旧从i开始就可以。但是一定不能再取到i-1或更前面的元素了,由于在取i-1的时候就已经把含有i-1的所有环境(包括可以重复和不可以重复的环境)都取过了。
  1. class Solution {
  2.     List<List<Integer>> res = new ArrayList<>();
  3.     List<Integer> path = new LinkedList<>();
  4.     public List<List<Integer>> combine(int n, int k) {
  5.         backingTrace(n,k,1);
  6.         return res;
  7.     }
  8.     public void backingTrace(int n, int k, int startIndex){
  9.         if(path.size() == k){
  10.             res.add(new ArrayList<>(path));
  11.             return;
  12.         }
  13.         for(int i = startIndex; i <=n; i++){
  14.             path.add(i);
  15.             backingTrace(n, k, i + 1);
  16.             path.removeLast();
  17.         }
  18.         
  19.     }
  20. }
复制代码
216、组合总和

        思绪和上一题差不多,注意sum如果已经大于目标值,没须要再组合下去了,我们组合出来的和都是递增的。
  1. class Solution {
  2.     List<List<Integer>> res = new ArrayList<>();
  3.     List<Integer> path = new LinkedList<>();
  4.     public List<List<Integer>> combinationSum3(int k, int n) {
  5.         backingTrace(k,n,1, 0);
  6.         return res;
  7.     }
  8.     private void backingTrace(int k, int n, int startIndex,int sum){
  9.         if(sum > n){
  10.             return;
  11.         }
  12.         if(path.size() == k){
  13.             if(sum == n){
  14.                 res.add(new ArrayList<>(path));
  15.             }
  16.             return;
  17.         }
  18.         for(int i = startIndex; i <=9 ; i++){
  19.             path.add(i);
  20.             backingTrace(k,n,i + 1,sum +i);
  21.             path.removeLast();
  22.         }
  23.     }
  24. }
复制代码
 17、电话号码的字母组合

         积累下StringBuilder的几个方法,添加元素append,删除元素deleteCharAt(index)
  1. class Solution {
  2. String[] numbers = {
  3.     "",
  4.     "",
  5.     "abc",
  6.     "def",
  7.     "ghi",
  8.     "jkl",
  9.     "mno",
  10.     "pqrs",
  11.     "tuv",
  12.     "wxyz"
  13. };
  14.     List<String> res = new ArrayList<>();
  15.     StringBuilder sb = new StringBuilder();
  16.     public List<String> letterCombinations(String digits) {
  17.         if(digits == null || digits.length() == 0) return res;
  18.         int[] digitsArr = new int[digits.length()];
  19.         for(int i = 0; i < digitsArr.length; i++){
  20.             int temp = digits.charAt(i) - '0';
  21.             digitsArr[i] = temp;
  22.             System.out.println(temp);
  23.         }
  24.         backingTrace(digitsArr,0);
  25.         return res;
  26.     }
  27.     private void backingTrace(int[] digits,int index){
  28.         if(index == digits.length){
  29.             res.add(sb.toString());
  30.             return;
  31.         }
  32.         //电话号码的第index位
  33.         int inNum = digits[index];
  34.         for(int i = 0; i < numbers[inNum].length(); i++)
  35.         {
  36.             char  cur = numbers[inNum].charAt(i);
  37.             sb.append(cur);
  38.             backingTrace(digits,index + 1);
  39.             sb.deleteCharAt(sb.length() - 1);
  40.         }
  41.     }
  42. }
  43. //二刷
  44. class Solution {
  45.         String[] numbers = {
  46.                         "",
  47.                         "",
  48.                         "abc",
  49.                         "def",
  50.                         "ghi",
  51.                         "jkl",
  52.                         "mno",
  53.                         "pqrs",
  54.                         "tuv",
  55.                         "wxyz"
  56.         };
  57.         List<String> res = new ArrayList<>();
  58.         StringBuilder sb = new StringBuilder();
  59.         public List<String> letterCombinations(String digits) {
  60.                 int n = digits.length();
  61.         if(n == 0) return res;
  62.                 int[] nums = new int[digits.length()];
  63.                 for(int i = 0; i < digits.length();i++){
  64.                         nums[i] = (int)(digits.charAt(i) -'0');
  65.                         System.out.println(nums[i]);
  66.                 }
  67.                 backingTrace(n,nums);
  68.                 return res;
  69.         }
  70.         private void backingTrace(int n, int[] nums){
  71.                 if(sb.length() == n){
  72.                         res.add(new String(sb));
  73.                         return;
  74.                 }
  75.         //当前遍历到电话号码的位置索引
  76.                 int location = sb.length();
  77.         //当前遍历到的电话号码数字
  78.                 int locationNum = nums[location];
  79.         //遍历数字按键对应的3-4个字母
  80.                 for(int i = 0; i < numbers[locationNum].length(); i++){
  81.                         //添加字母
  82.             sb.append(numbers[locationNum].charAt(i));
  83.                         backingTrace(n,nums);
  84.                         sb.deleteCharAt(sb.length() - 1);
  85.                 }
  86.         }
  87. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

郭卫东

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表