1 /*
 2  * @Author: yaodaoteng
 3  * @Date: 2020-11-22 09:05:29
 4  * @LastEditors: yaodaoteng
 5  * @LastEditTime: 2020-11-22 09:13:32
 6  * @FilePath: \leetcode\77.组合.cpp
 7  */
 8 /*
 9  * @lc app=leetcode.cn id=77 lang=cpp
10  *
11  * [77] 组合
12  */
13 
14 // @lc code=start
15 class Solution {
16 public:
17 //每次从集合中选取元素,可选择的范围随着选择的进行而收缩,调整可选择的范围,就是要靠startIndex
18     vector<vector<int>> res;
19     vector<int> path;
20     vector<vector<int>> combine(int n, int k) {
21         backtracking(n, k,1);
22         return res;
23     }
24     void backtracking(int n,int k,int index){
25         if(path.size()==k){
26             res.push_back(path);
27             return;
28         }
29         for (int i = index; i <= n;i++){// 控制树的横向遍历
30             path.push_back(i);
31             backtracking(n, k, i + 1);// 递归:控制树的纵向遍历,注意下一层搜索要从i+1开始
32             path.pop_back();// 回溯,撤销处理的节点
33         }
34     }
35 };
36 // @lc code=end