• 代码随想录二刷 Day 29


    39. 组合总和

    这个题与昨天第一题的区别就只有下面这一句(从i+1改成了i),下面这一句就确保了一个数字可以重复使用,但是又不会出现重复的结果,这个要根据树形图理解下

    另外这个题减枝的方法是先排序然后再剪纸;这样的话如果上一层递归的sum已经大于或者等于target,就直接跳出这个循环;

    下面这句话是终止本层遍历

    40.组合总和II

    这个题也是要排序后再做;在回溯的过程中used数组会被重置就跟sum一样,所以直接写在单层逻辑里就行

    1. class Solution {
    2. public:
    3. vectorint>> result;
    4. vector<int> path;
    5. int sum = 0;
    6. int start_index = 0;
    7. void traversal(vector<int>& candidates, int target, int sum, int start_index, vector<bool> used) {
    8. if (sum > target) return;
    9. if (sum == target) {
    10. result.push_back(path);
    11. return;
    12. }
    13. for( int i = start_index; i < candidates.size(); i++) {
    14. // 要对同一树层使用过的元素进行跳过
    15. if (i > 0 && candidates[i] == candidates[i - 1] && used[i - 1] == false) {
    16. continue;
    17. }
    18. sum += candidates[i];
    19. path.push_back(candidates[i]);
    20. used[i] = true; //这句不会写,就是取了这个数就把他置1
    21. //traversal(candidates, target, sum, start_index + 1, used);这句写错了,因为i一直在变但是start_index这个变量一直是零
    22. traversal(candidates, target, sum, i + 1, used);
    23. used[i] = false;
    24. sum -= candidates[i];
    25. path.pop_back();
    26. }
    27. }
    28. vectorint>> combinationSum2(vector<int>& candidates, int target) {
    29. vector<bool> used(candidates.size(), 0);
    30. sort(candidates.begin(), candidates.end());
    31. traversal(candidates, target,0,0,used);
    32. return result;
    33. }
    34. };

     131.分割回文串

    如何利用startindex和i进行切割这个还需要再理解下, 这个自己写不出;

    第一大层递归的时候index是0,然后进入递归第二层小递归for循环第一次只切割一个数字出来;然后第二层小递归for第二次就会切出俩数,但是这个不符合就直接去掉了。

    第二大层递归的时候index是1,所以第一次切割会直接切割出俩数,然后第二层小递归也是一个一个切割;

    第三大层递归index是2,所以第一次切割会切割出仨数

    1. class Solution {
    2. public:
    3. // vector path; 这里搞错了
    4. // vector> result;
    5. vector path;
    6. vector> result;
    7. bool Palindrome(string &s,int start, int end){
    8. while(start< end){
    9. if(s[start]!=s[end])
    10. {return false;}
    11. else{
    12. start++;
    13. end--;
    14. }
    15. }
    16. return true;
    17. }
    18. void backtracking(string &s, int start_index){
    19. if(start_index == s.size()) {
    20. result.push_back(path);
    21. return;
    22. }
    23. for(int i=start_index;isize();i++){
    24. if(Palindrome(s,start_index,i)){
    25. string str=s.substr(start_index, i-start_index+1);
    26. //path.push_back(s[i]); 这行写错了这个题要把这一段的数字都取出来,所以重新定义了一个变量
    27. path.push_back(str);
    28. }else{
    29. continue;
    30. }
    31. backtracking(s,i+1);
    32. path.pop_back();
    33. }
    34. }
    35. vector> partition(string s) {
    36. backtracking(s,0);
    37. return result;
    38. }
    39. };

  • 相关阅读:
    C++丨初识C++像极了C语言
    语音信号处理中的“窗函数”
    SpringMVC实现接收前端的数据(从一个网页输入数据,然后将数据提交到另外一个网页,并进行输出)
    真题集P115---2015年真题(以及 力扣54)
    TELEC认证标准是什么?
    win10连接远程服务访问文件提示:文件共享不安全,不能连接文件共享
    10年阿里人告诉你:秒杀系统设计就该这么玩
    gitlab重置root密码
    TPE-3-CHO;CAS:2351847-81-7;AIE聚集诱导发光
    redis安装及集群搭建
  • 原文地址:https://blog.csdn.net/weixin_43908951/article/details/133606757