cpp
复制代码
class Solution {
public:
vector<int> path; // 存储当前组合的临时路径
vector<vector<int>> result; // 存储所有符合条件的组合结果
// 回溯函数
// 参数说明:
// k - 需要的数字个数
// n - 目标和
// start - 当前搜索起始数字(1-9)
// count - 当前路径中数字的总和
void backtracking(int k, int n, int start, int count) {
// 终止条件:路径长度达到k
if (path.size() == k) {
// 如果当前总和等于目标值n,将路径加入结果集
if (count == n) {
result.push_back(path);
}
return; // 结束当前分支
}
// 遍历可能的数字选择(1-9)
for (int i = start; i <= 9; i++) {
path.push_back(i); // 选择当前数字i加入路径
count += i; // 更新当前总和
// 递归进入下一层,从i+1开始(避免重复使用数字)
backtracking(k, n, i + 1, count);
// 回溯:撤销选择
path.pop_back(); // 从路径中移除当前数字
count -= i; // 从总和中减去当前数字
}
}
vector<vector<int>> combinationSum3(int k, int n) {
// 剪枝优化:检查最小可能和是否已超过n
int j = 1; // 从1开始
int sum = 0; // 计算最小可能和
for (int i = 0; i < k; i++) {
sum += j; // 累加连续最小数字
j++; // 数字递增
if (sum > n) return result; // 如果最小可能和已大于n,直接返回空结果
}
// 开始回溯搜索
backtracking(k, n, 1, 0);
return result; // 返回所有符合条件的组合
}
};