題目鏈接在此
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層for循環也能暴力地弄出來。
但是這裏k是不固定的,那麼要想辦法模擬k層for循環。
嗯。回溯+遞歸。
class Solution {
public:
vector<vector<int> > combine(int n, int k) {
vector<vector<int> > v;
if (k < 1 || n < k)
return v;
vector<int> comb;
backTrack(v, comb, n, k, 1);
/*
for (int i = 0; i < v.size(); i++) {
for (int j = 0; j < v[i].size(); j++) {
cout << v[i][j] << ' ';
}
cout << '\n';
}
*/
return v;
}
private:
void backTrack(vector<vector<int> > &v, vector<int> &comb, int n, int k, int start) {
if (k == 0) {
v.push_back(comb);
return;
}
for (int i = start; i <= n; i++) {
comb.push_back(i); // 如果集合S中的元素不是有序的1~n,把i改成S[i]即可
backTrack(v, comb, n, k - 1, i + 1);
comb.pop_back();
}
}
};