一、题目

给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。

你可以按 任何顺序 返回答案。



示例 1:

输入:n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]

示例 2:

输入:n = 1, k = 1
输出:[[1]]



提示:

1 <= n <= 20
1 <= k <= n

二、思路
  • 增加一个剪枝,当选取最后所有的元素都不能满足长度直接返回
三、代码

class Solution {
public:
vector<vector<int>> combine(int n, int k) {
vector<vector<int>> ans;
vector<int> t;
dfs(ans, t, n, k, 1);
return ans;
}
void dfs(vector<vector<int>>& ans, vector<int>& t, int n, int k, int s) {
//剪枝 最后的个数不满足了 直接返回
if (t.size() + n - s + 1 < k) return;
if (t.size() == k) {
ans.push_back(t);
return ;
}
for (int i = s; i <= n; i++) {
t.push_back(i);
dfs(ans, t, n, k, i + 1);
t.pop_back();
}
}
};