leetcode 216.组合总和III

79 阅读1分钟

和组合问题有啥区别?回溯算法如何剪枝?| LeetCode:216.组合总和III_哔哩哔哩_bilibili

image.png

这个是我刚开始画的递归回溯图,这个图需要取3次值,再去回溯。

image.png

然后看了代码随想录画的图: 假设n=4,k=2

image.png

class Solution { public: vector<int> temp; vector<vector<int>> result;


int sum=0;
void backtracking(int index, int k, int n) {//index初始值为1  k为深度,控制沿途取多少个值 n控制结束条件

    //循环结束条件
    if (temp.size() == k && sum== n) {
        result.push_back(temp);
        return;
    }


    //单层搜索逻辑
    for (int i = index; i <= 9; i++) { //i<=9,控制宽度最大为9

        sum+=i;
        temp.push_back(i);
        backtracking(i + 1, k, n);
        sum-=i;
        temp.pop_back();
    }
}

vector<vector<int>> combinationSum3(int k, int n) {
    backtracking(1, k, n); 
    return result;
}
};

优化

class Solution { public: vector<int> temp; vector<vector<int>> result;

void backtracking(int index, int k, int n) {//index初始值为1  k为深度,控制沿途取多少个值 n控制结束条件


if(sum>n)return;//剪枝操作,可有可无


    //循环结束条件
    if (temp.size() == k && accumulate(temp.begin(), temp.end(), 0) == n) {
        result.push_back(temp);
        return;
    }


    //单层搜索逻辑
    for (int i = index; i <= 9; i++) { //剪枝操作
        temp.push_back(i);
        backtracking(i + 1, k, n);
        temp.pop_back();
    }
}

vector<vector<int>> combinationSum3(int k, int n) {
    backtracking(1, k, n); 
    return result;
}
};

//accumulate为STL的一个容器,用来计算其他容器的和。需要三个参数,起始位置,结束位置,初始值