题意理解
输入最大数字和组合长度,求1到最大数字之间数字的组合长度等于给定的组合长度,输出所有这样的组合。
问题分析
回溯法
实质是dfs
指定限制条件,指定搜索范围。
参数有一个结果集,有一个单个结果,有一个候选集,有一个终止条件,有一个当前位置。
其他
链接
vector<vector<int>> combine(int n, int k) {
vector<vector<int>> results{};
vector<int> result{};
vector<int> candidates;
for (int i = 0; i < n; i ++) //转化为候选集
{
candidates.push_back(i + 1);
}
dfs (results, result, candidates, k, 0);
return results;
}
void dfs (vector<vector<int>>& results, vector<int>& result, vector<int> candidates, int k, int level) // 组合结果集,单个结果,候选集,限制长度,当前层级
{
//边界
if (result.size() == k) //长度满足条件
{
results.push_back(result); //单个结果加入结果集中
return;
}
//搜索
for (int i = level; i != candidates.size() && result.size() < k; i ++) //遍历当前候选值
{
result.push_back(candidates[i]); //候选值加入单个结果
dfs(results, result, candidates, k, i + 1); //递归遍历,候选集范围缩小1
result.pop_back(); //回退当前候选值
}
}