题目描述
解题思路
画树状图,找终止条件,弹出不需要的值
代码
这题可以直接套用回溯算法的模板
void backtracking(参数) {
if (终⽌条件) {
存放结果;
return;
}
for (选择:本层集合中元素(树中节点孩⼦的数量就是集合的⼤⼩)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
}
套完模板会发现超出时间限制
#include<bits/stdc++.h>
using namespace std;
#include<vector>
class Solution {
private:
vector<vector<int>> result;
vector<int> path;
void backTracking(int k,int n,int startIndex,int sum){
if(sum == n){
result.push_back(path);
}
return;
}
for(int i = startIndex; i <= 9; i++){
//(9-(k-path.size())+1)的意思是最多可以从哪里开始取数字
path.push_back(i);
sum += i;
backTracking(k,n,i+1,sum);
sum -= i;
path.pop_back();
}
}
public:
vector<vector<int>> combinationSum3(int k, int n) {
backTracking(k,n,1,0);
return result;
}
};
减枝(去掉没必要进行的部分)后能通过
#include<bits/stdc++.h>
using namespace std;
#include<vector>
class Solution {
private:
vector<vector<int>> result;
vector<int> path;
void backTracking(int k,int n,int startIndex,int sum){
if(path.size() == k){
if (sum > n) {
// 剪枝操作
return;
}
if(sum == n){
result.push_back(path);
}
return;
}
for(int i = startIndex; i <= (9-(k-path.size())+1); i++){
//(9-(k-path.size())+1)的意思是最多可以从哪里开始取数字
path.push_back(i);
sum += i;
backTracking(k,n,i+1,sum);
sum -= i;
path.pop_back();
}
}
public:
vector<vector<int>> combinationSum3(int k, int n) {
backTracking(k,n,1,0);
return result;
}
};