力扣 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