1、题目
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
你可以按 任何顺序 返回答案。
链接:https://leetcode-cn.com/problems/combinations/
2、思路分析
1)递归实现组合型枚举
减掉一些不可能出现的情况,例如dfs中的长度问题。
组合型枚举:考虑当前的值还是不考虑当前的值。代码的基本框架。
当满足 k== temp.size()时,将其添加到 ret 中。
class Solution {
public:
vector<vector<int>> ret;
vector<int> temp;
void dfs(int cur, int n, int k)
{
if(temp.size() + (n - cur + 1) < k){
return; // 剪枝:如果temp。size() + [cur, n]的长度小于k,就不可能构造出长度k的temp
}
if(temp.size() == k){
ret.push_back(temp);
return;
}
// 考虑当前情况
temp.push_back(cur);
dfs(cur + 1, n, k);
temp.pop_back();
// 不考虑当前情况
dfs(cur+ 1, n, k);
}
vector<vector<int>> combine(int n, int k) {
dfs(1, n, k);
return ret;
}
};