代码随想录之回溯第一课

要领:类型题目,用具体的一个例子来记忆,就够了,印象更加深刻。

一个题目,感觉理解不深刻,不透彻,不清晰,不熟练,就是不达标。

怎么做?

每天回顾复习看一次,写一次 并且 永远相信下一次看这个题目,写这个题目。自己的理解深度,是人生当中最深刻的一次!!!!

结果:把这个具体的题目吃到最透,那么这一类题目,你都就能拿下了。

组合问题:

剪枝操作举例: 比如n=4,k=3;那么 ,目前选取元素为个数为0的时候,i<=n-(k-path.size())+1;

i<= 4 - (3 - 0) +1=2; 至多从2开始后面也可以。后面就不行了。比如234.可以。

 组合总和三 

 

这里,再次深刻的理解,剪枝操作;

树层上的剪枝:9  -(k - path.size())+1; 比如是k = 4,那么计算 i <= 9-(4-0)+1, i <= 6,至多从六开始,比如6789。就是最后面的一个位置了,再往后就不行了。

树枝上的剪枝:进入for循环处理的时候,放入一个元素,如果大小已经超过了targetSum,就没有必要再去进行加到第k个元素了,先回溯,再直接退出这一层,返回上一层。执行for循环下一个元素。

 电话号码的字母组合

解题思想:我们需要把啥?把电话号码 和 对应的字符 能够保存起来。怎么处理呢?我们选择使用string类型的数组来存放。const string letterMap[10]{ };让字符串 和 数组下标对应;然后我们用,string s,来保存一次的执行结果,vector<string> result;来保存结果集。然后计就是递归函数。首先,终止条件:digits字符串里面是"23".然后index表示的是,当前我们操作的数digits字符串里面的第几个字符,也体现的是这个二叉树的深度。(也就是我们目前收集的元素的个数)当收集的元素的个数 == digits大小的时候,说明已经够了,可以把它插入结果集 result,并且返回了。

如何拿到digits字符串里面的第一个字符元素,并且把它转化成,int类型,然后从而找到,letterMap里面对应的字符串。 拿到这个字符串,才是目的,因为我们要遍历的集合就是这个啊。我们采用技术。index刚开始给0.然后 采用 int digit = digits[index] - '0'; 将他转换成整形。然后呢?采用string letters = lettersMap[digit];就拿到了digits字符串首元素字符对应的字符串。

然后就是for循环,这个很熟悉了。

结果注意:要单独写if(digits.size() == 0) return result;

我们为什么不需要要startIndex? 因为这个都是两个集合,不需要考虑元素重复。比如只有一个集合的话就需要考虑:就是这一层操作这个元素,下一次操作元素就要从下一个位置的元素开始,要不然一个元素用两次,出现错误。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值