代码随想录二刷 Day 29

39. 组合总和

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

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

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

40.组合总和II

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

class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;
    int sum = 0;
    int start_index = 0;

    void traversal(vector<int>& candidates, int target, int sum, int start_index, vector<bool> used) {
        if (sum > target) return;
        if (sum == target) {
            result.push_back(path);
            return;
        }
        
        for( int i = start_index; i < candidates.size(); i++) {

             // 要对同一树层使用过的元素进行跳过
            if (i > 0 && candidates[i] == candidates[i - 1] && used[i - 1] == false) {
                continue;
            }
            sum += candidates[i];
            path.push_back(candidates[i]);
            used[i] = true; //这句不会写,就是取了这个数就把他置1
            //traversal(candidates, target, sum, start_index + 1, used);这句写错了,因为i一直在变但是start_index这个变量一直是零
            traversal(candidates, target, sum, i + 1, used);
            used[i] = false;
            sum -= candidates[i];
            path.pop_back();
        }
    }

    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        vector<bool> used(candidates.size(), 0);
        sort(candidates.begin(), candidates.end());
        traversal(candidates, target,0,0,used);  
        return result; 
    }
};

 131.分割回文串

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

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

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

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

class Solution {
public:
   // vector<int> path; 这里搞错了
   // vector<vector<int>> result;
   vector<string> path; 
   vector<vector<string>> result;


   bool Palindrome(string &s,int start, int end){
       while(start< end){
           if(s[start]!=s[end])
           {return false;}
           else{
               start++;
               end--;
           }
       }
       return true;
   }

    void backtracking(string &s, int start_index){ 

        if(start_index == s.size()) {
            result.push_back(path);
            return;
        }

        for(int i=start_index;i<s.size();i++){
            if(Palindrome(s,start_index,i)){
                string str=s.substr(start_index, i-start_index+1);
                //path.push_back(s[i]); 这行写错了这个题要把这一段的数字都取出来,所以重新定义了一个变量
                path.push_back(str);
            }else{
                continue;
            }
            backtracking(s,i+1);
            path.pop_back();
        }
    }

    vector<vector<string>> partition(string s) {

        backtracking(s,0);
        return result;
    }
};

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值