LeetCode 组合总和III(回溯法+剪枝)

找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。

说明:

所有数字都是正整数。
解集不能包含重复的组合。 

示例 1:

输入: k = 3, n = 7
输出: [[1,2,4]]

示例 2:

输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]

思路分析:这种经典的组合、排序问题一般都是利用回溯法进行搜索。

class Solution {
public:
	vector<vector<int>> result;
	//从[lastSeletc + 1, 9]继续搜索剩下的remainN
	void dfs(vector<int> &tempRes, int k, int step, int lastSelet, int remainN){
		if (step >= k){//如果搜索完成
			if (remainN == 0){//符合条件
				result.push_back(tempRes);
			}
			return;
		}
		//为避免重复选择,这里只能选择比上一次大的元素
		for (int beginSelet = lastSelet + 1; beginSelet <= 9; ++beginSelet){
			//这里是一个剪枝算法
			//beginSelet == remainN为正好搜索完毕的情况
			//beginSelet * 2 < remainN 因为如果没有搜索结果必须选择beginSelet和一个大于beginSelet的元素
			if (beginSelet == remainN || beginSelet * 2 < remainN){
				tempRes.push_back(beginSelet);//放入中间结果
				dfs(tempRes, k, step + 1, beginSelet, remainN - beginSelet);
				tempRes.pop_back();//上一次搜索完成后需要将上一次放入的pop
			}
		}
	}
	vector<vector<int>> combinationSum3(int k, int n) {
		vector<int> tempRes;//单个解
		dfs(tempRes, k, 0, 0, n);//开始搜索
		return result;
	}
};

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41855420/article/details/88072439