代码随想录二刷 Day 29

39. 组合总和

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

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

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

40.组合总和II

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

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

    void traversal(vector& candidates, int target, int sum, int start_index, vector 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> combinationSum2(vector& candidates, int target) {
        vector 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,所以第一次切割会切割出仨数

代码随想录二刷 Day 29_第1张图片

class Solution {
public:
   // vector path; 这里搞错了
   // vector> result;
   vector path; 
   vector> 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> partition(string s) {

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

你可能感兴趣的:(算法,leetcode,职场和发展)