给定两个整数 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 <= 201 <= k <= n
- class Solution {
- public:
- vector
int>> res; - vector<int>path;
- void backtracking(int n,int k,int startindex){
- if(path.size() == k){
- res.push_back(path); // 把结果 放入res:
- return;//回退上一层
- }
- //不涉及 一些约束条件(和,或者数字的性质),只能从宽度上剪枝
- //当已经取了x个数,剩下的数字不够了,直接剪枝掉
- //k-path.size(),表示已经取的数。最多,从n-(k-path.size())+1,这个位置,后面能够取,再多一个,就凑不齐k个了。
- for(int i = startindex;i <= n-(k-path.size())+1;i++){
- path.push_back(i); //暂时 记录
- backtracking(n,k,i+1); // 开始进入下一层
- path.pop_back(); // 回退后,得把刚刚存入的 弹出
- }
- }
- vector
int>> combine(int n, int k) { - backtracking(n,k,1);
- return res;
- }
- };