要求

  • 给出两个整数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

[刷题] 77 Combinations的更多相关文章

  1. leetcode刷题-77组合

    题目 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合. 示例: 输入: n = 4, k = 2输出:[ [2,4], [3,4], [2,3], [1,2], [1,3 ...

  2. Leetcode OJ 刷题

    Valid Palindrome吐槽一下Leetcode上各种不定义标准的输入输出(只是面试时起码能够问一下输入输出格式...),此篇文章不是详细的题解,是自己刷LeetCode的一个笔记吧,尽管没有 ...

  3. leetcode刷题指南

    转载自:http://blog.csdn.net/lnho2015/article/details/50962989 以下是我个人做题过程中的一些体会: 1. LeetCode的题库越来越大,截止到目 ...

  4. leetcode 刷题记录(java)-持续更新

    最新更新时间 11:22:29 8. String to Integer (atoi) public static int myAtoi(String str) { // 1字符串非空判断 " ...

  5. 【刷题记录】BZOJ-USACO

    接下来要滚去bzoj刷usaco的题目辣=v=在博客记录一下刷题情况,以及存一存代码咯.加油! 1.[bzoj1597][Usaco2008 Mar]土地购买 #include<cstdio&g ...

  6. [LeetCode] 系统刷题5_Dynamic Programming

    Dynamic Programming 实际上是[LeetCode] 系统刷题4_Binary Tree & Divide and Conquer的基础上,加上记忆化的过程.就是说,如果这个题 ...

  7. C#LeetCode刷题-回溯算法

    回溯算法篇 # 题名 刷题 通过率 难度 10 正则表达式匹配   18.8% 困难 17 电话号码的字母组合   43.8% 中等 22 括号生成   64.9% 中等 37 解数独   45.8% ...

  8. leetcode刷题目录

    leetcode刷题目录 1. 两数之和 2. 两数相加 3. 无重复字符的最长子串 4. 寻找两个有序数组的中位数 5. 最长回文子串 6. Z 字形变换 7. 整数反转 8. 字符串转换整数 (a ...

  9. LeetCode刷题系列

    LeetCode 我们工作面试和提高自身数据结构和算法能力的时候往往需要刷刷题,我选择LeetCode是通过一个留学论坛了解的.专业,覆盖语种全面. 提前说说刷题的心得: 尽量手写代码,少使用IDE的 ...

随机推荐

  1. SQL 存储过程里调用另一个存储过程

    由于创建了一个存储过程,并且要在另一个存储过程里调用这个存储过程所以在网上找了一下相关的代码,现在总结一下,防止以后还会用到 由于这次我写的存储过程只需要返回一个求和的结果,所以我使用了output ...

  2. SSL证书详解和CFSSL工具使用

    公钥基础设施(PKI) 基础概念 CA(Certification Authority)证书,指的是权威机构给我们颁发的证书. 密钥就是用来加解密用的文件或者字符串.密钥在非对称加密的领域里,指的是私 ...

  3. C++并发与多线程学习笔记--多线程数据共享问题

    创建和等待多个线程 数据和共享问题分析 只读的数据 有读有写 其他案例 共享数据的保护案例代码 创建和等待多个线程 服务端后台开发就需要多个线程执行不同的任务.不同的线程执行不同任务,并返回执行结果. ...

  4. Python数据分析入门(十):数据清洗和准备

    数据清洗是数据分析关键的一步,直接影响之后的处理工作 数据需要修改吗?有什么需要修改的吗?数据应该怎么调整才能适用于接下来的分析和挖掘? 是一个迭代的过程,实际项目中可能需要不止一次地执行这些清洗操作 ...

  5. 生产环境中mysql数据库由主从关系切换为主主关系

    目录 一.清除原从数据库数据及主从关系 1.1.关闭主从数据库原有的主从关系 1.2.清除从数据库原有数据 二.将主库上的数据备份到从库 2.1.备份主库数据到从库 2.2.在从库使用tsc.sql文 ...

  6. Python基础(二十一):面向对象“类”第四课——魔法方法

    先划一下重点: 6个魔法方法: 动态操作属性的4个函数: 魔法方法 魔法方法的简单介绍 魔法方法的命名规则:方法名(前后各有2个下划线). 通常情况下,不会主动去调用魔法方法,而是在满足一定的条件下, ...

  7. 【pytest系列】- assert断言的使用

    unittest断言方式是用过框架自己实现的,即self.assertEqual()等,当我们使用pytest框架后,这种断言方式是不可用的,因为测试类不会再继承unittest.TestCase类, ...

  8. 《疯狂Kotlin讲义》读书笔记4——流程控制

    流程控制 与Java类似,Kotlin同样提供了两种基本的流程控制结构:分支结构和循环结构. Kotlin提供了 if 和 when 两种分支语句,其中 when 语句可以代替Java的switch语 ...

  9. 关于 下载 nfs-utils时的 gssproxy conflicts with selinux-policy-3.13.1-102.el7.noarch 错误

    使用 yum install nfs-utils -y 时 出现如下错误: 错误:gssproxy conflicts with selinux-policy-3.13.1-102.el7.noarc ...

  10. 《C标准库》学习笔记整理

    简介 <C标准库>书中对 C 标准库中的 15 个头文件的内容进行了详细的介绍,包括各头文件设计的背景知识.头文件中的内容.头文件中定义的函数和变量的使用.实现.测试等. 我学习此书的目的 ...