要求

  • 给出两个整数n和k,在n个数字中选出k个数字的所有组合

示例

  • n=4 , k=2
  • [ [ 1, 2 ] , [ 1, 3 ] , [ 1, 4 ] , [ 2, 3 ] , [ 2, 4 ] , [ 3, 4 ] ]

思路

实现

  • combine():求解C(n,k)
  • generateCombinations():递归求解
  • res:二维向量,保存已经找到的组合
  • start:整型,开始搜索的位置
  • c:向量,已经找到的组合
 1 class Solution {
2
3 private:
4 vector<vector<int>> res;
5
6 // 求解C(n,k),当前已经找到的组合存在c中,从start开始搜索新元素
7 void generateCombinations(int n , int k , int start, vector<int> &c){
8
9 if( c.size() == k ){
10 res.push_back(c);
11 return;
12 }
13
14 for( int i = start ; i <= n ; i ++ ){
15 c.push_back(i);
16 generateCombinations(n, k, i + 1, c);
17 // 回溯
18 c.pop_back();
19 }
20 return;
21 }
22 public:
23 vector<vector<int>> combine(int n, int k) {
24 res.clear();
25 if( n <= 0 || k <= 0 || k > n)
26 return res;
27 vector<int> c;
28 generateCombinations(n, k, 1, c);
29
30 return res;
31 }
32 };

优化

  • 剪枝:为递归树剪去不需要搜索的分支
  • 如上图中取4的分支
  • 当k(递归层数)较大时优化效果明显
 1 class Solution {
2
3 private:
4 vector<vector<int>> res;
5
6 // 求解C(n,k),当前已经找到的组合存在c中,从start开始搜索新元素
7 void generateCombinations(int n , int k , int start, vector<int> &c){
8
9 if( c.size() == k ){
10 res.push_back(c);
11 return;
12 }
13
14 // 进入函数时还有k-c.size()个空位
15 // 所以[i...n]中至少要有k-c.size()个元素
16 // 故i最多为 n - (k-c.size()) + 1
17 for( int i = start ; i <= n - (k-c.size()) + 1 ; i ++ ){
18 c.push_back(i);
19 generateCombinations(n, k, i + 1, c);
20 // 回溯
21 c.pop_back();
22 }
23 return;
24 }
25 public:
26 vector<vector<int>> combine(int n, int k) {
27 res.clear();
28 if( n <= 0 || k <= 0 || k > n)
29 return res;
30 vector<int> c;
31 generateCombinations(n, k, 1, c);
32
33 return res;
34 }
35 };

相关

  • 39 Combination Sum
  • 40 Combination Sum II
  • 216 Combination Sum III
  • 78 Subsets
  • 90 Subsets II
  • 401 Binary Watch

最新文章

  1. macOS sierra 10.12 Cocoapods 私有库
  2. Vim特定行行尾追加
  3. 配置算法(第4版)的Java编译环境
  4. 设置UISegmentedControl中字体大小
  5. css2图片边框
  6. powerdesigner 15 如何导出sql schema
  7. 解决iPhone上select时常失去焦点,随意跳到下一个输入框,影响用户操作
  8. ArcGIS学习记录-Excel和Txt中XY点数据生成点Shape文件方法
  9. 前台之boostrap
  10. asp.net读取文件
  11. ios9 新关键字 __kindof 等(etc) 小结
  12. delphi 中COPY()函数的意思
  13. 函数式编程之foldLeftViaFoldRight
  14. RPA简介
  15. Game Engine Architecture 3
  16. 二叉搜索树的第k个节点
  17. Mysql Window 解压版 忘记密码
  18. Linux服务器上搭建web项目环境
  19. css实现table中td单元格鼠标悬浮时显示更多内容
  20. php性能优化(一)压力測试工具篇

热门文章

  1. [Fundamental of Power Electronics]-PART I-4.开关实现-4.2 功率半导体器件概述
  2. BUAA_2021_SE_Pair_Work_#3_Review
  3. 「Spring Boot 2.4 新特性」一键构建Docker镜像
  4. 在Visual Studio 中使用git——给Visual Studio安装 git插件(二)
  5. 在Win10中手动添加/修改本地IP
  6. ForkJoinPool的工作原理和使用
  7. C语言头文件到底是什么?
  8. kafka配置内外网访问
  9. MYSQL中TIMESTAMP类型的默认值理解
  10. 从苏宁电器到卡巴斯基第27篇:难忘的三年硕士时光 V