题目描述
Given two integers n and k, return all possible combinations of k numbers out of 1 … n.
For example,
If n = 4 and k = 2, a solution is:[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
构造解很简单,就是用一个k-重循环把所有的不重复数字遍历,但是由于k不确定显然不可以写出k重循环的代码所以需要用递归。
考虑到combine(n,k)可以在k-1的基础上加以构造,只要让i从n到k遍历,求出combine(i-1,k-1)的解,再把解中的每一项在尾端补上i,把所有得到的vector都拼接起来即可构造出k的解。得到递归关系后就需要寻找初始条件,显然在k=1的情况下,解就是1-n的每个数构成的vector。
最终代码如下:
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
vector<vector<int>> result;
if (n<k) return result;
if(k==1) {
for(int i=0; i<n; i++) {
vector<int> tmp={i+1};
result.push_back(tmp);
}
return result;
}
for(int i=k-1; i<n; i++) {
vector<vector<int>> tmp = combine(i, k-1);
for(int j=0; j<tmp.size(); j++) tmp[j].push_back(i+1);
result.insert(result.end(), tmp.begin(), tmp.end());
}
return result;
}
};
本文介绍了一个经典的组合问题——从n个数中选择k个数的所有可能组合,并提供了一种使用递归方法来解决该问题的有效途径。通过构建递归关系并找到适当的初始条件,实现了简洁且高效的代码实现。
544

被折叠的 条评论
为什么被折叠?



