组合
给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。
示例: 输入: n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/combinations
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
组合就是从 n 个元素中取 k 个元素。
由于组合不要求元素排序,所以我们直接按照序列从左往右深度优先遍历来构造,符合个数 k 则保存结果,达到边界条件则回溯。
我们设置两个数组,一个 res 数组来存储最终答案,一个临时数组 temp 用来筛选答案。
vector<int> temp; //构造答案,符合要求则返回
vector<vector<int>> res; //存储符合要求的所有temp数组
深度优先遍历的过程:
void dfs(int n,int k, int cur) { //n个数中选择k个,cur是目前遍历到的位置
if (temp.size() == k) { //符合要求
res.push_back(temp);
return;
}
for(int i = cur;i <= n;i ++){
temp.push_back(i); //选择i
dfs(n,k,i+1);
temp.pop_back(); //跳过i
}
}
完整代码:
class Solution {
public:
vector<vector<int>> res;
vector<int> temp;
void dfs(int n,int k, int cur) {
if (temp.size() == k) { //符合要求
res.push_back(temp);
return;
}
for(int i = cur;i <= n;i ++){
temp.push_back(i); //选择i
dfs(n,k,i+1);
temp.pop_back(); //跳过i
}
}
vector<vector<int>> combine(int n, int k) {
dfs(n,k,1); //深搜起点
return res;
}
};
运行结果: