要领:类型题目,用具体的一个例子来记忆,就够了,印象更加深刻。
一个题目,感觉理解不深刻,不透彻,不清晰,不熟练,就是不达标。
怎么做?
每天回顾复习看一次,写一次 并且 永远相信下一次看这个题目,写这个题目。自己的理解深度,是人生当中最深刻的一次!!!!
结果:把这个具体的题目吃到最透,那么这一类题目,你都就能拿下了。
组合问题:
剪枝操作举例: 比如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? 因为这个都是两个集合,不需要考虑元素重复。比如只有一个集合的话就需要考虑:就是这一层操作这个元素,下一次操作元素就要从下一个位置的元素开始,要不然一个元素用两次,出现错误。