トピックの説明
問題解決のアイデア
樹形図を描いて終了条件を見つけ、不要な値をポップアップさせる
コード
この質問はバックトラッキング アルゴリズムのテンプレートを直接適用できます。
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;
}
};