リンク 216. 結合和 [C++]

トピックの説明

ここに画像の説明を挿入

問題解決のアイデア

樹形図を描いて終了条件を見つけ、不要な値をポップアップさせる

コード

この質問はバックトラッキング アルゴリズムのテンプレートを直接適用できます。

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;
	}
};

おすすめ

転載: blog.csdn.net/qq_63524016/article/details/129676541