代码随想录DAY25 | 216 、17

216. 组合总和 III

代码随想录DAY25 | 216 、17_第1张图片

  1. 代码终止条件处代码的写法:有着一点点相同的思路写出的代码,但是高下力鉴。
  2. 终止条件:就是处理递归回溯完成之后所得结果的处理,自然而然地就包含符合与不符合
  3. 单层递归和回溯先写好,然后进行剪枝操作,都想要反而得不偿失
  4. 回溯与递归的关系:
  5. 单层搜索:就是单纯普遍的一层搜索逻辑的实现,此处是普适性的体现,不要去想什么特殊情况

剪枝操作

代码随想录DAY25 | 216 、17_第2张图片代码随想录DAY25 | 216 、17_第3张图片

代码随想录DAY25 | 216 、17_第4张图片

  1.   我这发锈的脑袋,只有想到针对于下标操作
  2.   剪枝为什么要进行回溯:
  3.   手动复现一下过程:
  4.   实现剪枝这个操作的本质就是 if 条件语句当中的  return; 
    return; 中断返回值为void类型的函数的执行,而带返回值的return则不行。相当于break
    break  直接跳出 当前 的循环,从当前循环外面开始执行,忽略循环体中任何其他语句和循环条件测试。它只能跳出一层循环,如果你的循环是嵌套循环,那么你需要按照你嵌套的层次,逐步使用break来跳出。

    continue   终止当前的一次循环过程,其 不 跳出循环,而是继续往下判断循环条件执行语句。只能结束循环中的一次过程,但不能终止循环继续进行。

  5. return; 就是退出当前函数

疑问:

break 与 return;的区别:

 return结束该方法返回, break跳出循环

 return; 就退出当前函数。

17. 电话号码的字母组合

问题

第一个:数字和字母的映射对应,可选择的数据结构——可以使用map或者定义一个二维数组

              数组就是下标和内容的映射对应。

首先问题就卡在 进入使用for循环的参数应该是什么,是字母,还是数字????

最重要的就是我没有意识到这个问题,从而选择了最麻烦的一种,也就是以数字入for循环

接着,为什么可以使用 字母入for循环,这道题目区别于前面的回溯的,将数字看出树结构是串行的,每一次都是基于数字的完全不相同。所以可以在for循环外边获取数字,只要在调用回溯函数时下标+1即可

细节处方显真知!!!!

代码随想录DAY25 | 216 、17_第5张图片

疑问:

string 转 int 

int digit = digits[index] - '0';        // 将index指向的数字转为int

回溯在什么时候进行: 

        一条树叉走到底,然后走到最后一个树叉回溯函数处,进行回溯,即弹出,然后for循环该层的下一个字母。

你可能感兴趣的:(算法,数据结构)