思路分析:
- 深度优先搜索 (DFS): 通过递归实现,尝试从数字 1 到 9 中选择可能的数字,构建和为
n
,长度为k
的组合。 - 递归函数
dfs
:- 接收参数:
result
为最终结果集,path
为当前正在生成的组合,n
为目标和,k
为组合长度,startn
为当前选择的数字起始位置,nownum
为当前组合的和。 - 遍历当前可能的数字,更新当前组合的和和将当前数字加入临时结果集。
- 如果当前组合的和等于目标值
n
,且临时结果集的大小等于目标长度k
,则将其加入最终结果集。 - 否则,继续递归生成组合,注意起始数字更新为
i+1
。 - 回溯过程中,撤销选择,继续尝试其他可能的组合。
- 接收参数:
- 主函数:
- 创建空的结果集
result
和临时结果集path
。 - 调用深度优先搜索函数
dfs
,从数字1
开始生成组合。 - 返回最终结果。
- 创建空的结果集
cpp
class Solution {
// 定义深度优先搜索函数,用于生成组合
void dfs(vector<vector<int>>& result, vector<int>& path, int n, int k, int startn, int nownum) {
// 遍历当前可能的数字
for (int i = startn; i <= 9; i++) {
// 如果当前数字加上当前和已有和超过目标值 n,则跳出循环,因为后续数字只会更大
if (nownum + i > n)
break;
// 更新当前和和将当前数字加入临时结果集
nownum += i;
path.push_back(i);
// 如果当前和等于目标值 n,并且临时结果集的大小等于目标长度 k,则将结果加入最终结果集
if (nownum == n && path.size() == k)
result.push_back(path);
else {
// 继续递归生成组合,注意起始数字更新为 i+1
dfs(result, path, n, k, i + 1, nownum);
}
// 回溯,撤销选择,继续尝试其他可能的组合
nownum -= i;
path.pop_back();
}
return;
}
public:
vector<vector<int>> combinationSum3(int k, int n) {
// 存储最终结果的二维数组
vector<vector<int>> result;
// 存储当前正在生成的组合的临时结果
vector<int> path;
// 调用深度优先搜索函数,从数字 1 开始生成组合
dfs(result, path, n, k, 1, 0);
// 返回最终结果
return result;
}
};