[刷题] 77 Combinations
要求
- 给出两个整数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的更多相关文章
- leetcode刷题-77组合
题目 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合. 示例: 输入: n = 4, k = 2输出:[ [2,4], [3,4], [2,3], [1,2], [1,3 ...
- Leetcode OJ 刷题
Valid Palindrome吐槽一下Leetcode上各种不定义标准的输入输出(只是面试时起码能够问一下输入输出格式...),此篇文章不是详细的题解,是自己刷LeetCode的一个笔记吧,尽管没有 ...
- leetcode刷题指南
转载自:http://blog.csdn.net/lnho2015/article/details/50962989 以下是我个人做题过程中的一些体会: 1. LeetCode的题库越来越大,截止到目 ...
- leetcode 刷题记录(java)-持续更新
最新更新时间 11:22:29 8. String to Integer (atoi) public static int myAtoi(String str) { // 1字符串非空判断 " ...
- 【刷题记录】BZOJ-USACO
接下来要滚去bzoj刷usaco的题目辣=v=在博客记录一下刷题情况,以及存一存代码咯.加油! 1.[bzoj1597][Usaco2008 Mar]土地购买 #include<cstdio&g ...
- [LeetCode] 系统刷题5_Dynamic Programming
Dynamic Programming 实际上是[LeetCode] 系统刷题4_Binary Tree & Divide and Conquer的基础上,加上记忆化的过程.就是说,如果这个题 ...
- C#LeetCode刷题-回溯算法
回溯算法篇 # 题名 刷题 通过率 难度 10 正则表达式匹配 18.8% 困难 17 电话号码的字母组合 43.8% 中等 22 括号生成 64.9% 中等 37 解数独 45.8% ...
- leetcode刷题目录
leetcode刷题目录 1. 两数之和 2. 两数相加 3. 无重复字符的最长子串 4. 寻找两个有序数组的中位数 5. 最长回文子串 6. Z 字形变换 7. 整数反转 8. 字符串转换整数 (a ...
- LeetCode刷题系列
LeetCode 我们工作面试和提高自身数据结构和算法能力的时候往往需要刷刷题,我选择LeetCode是通过一个留学论坛了解的.专业,覆盖语种全面. 提前说说刷题的心得: 尽量手写代码,少使用IDE的 ...
随机推荐
- 运维趋势2019年总结,运维就是要做到"技多不压身"
2019年 在互联网这个行业中对运维的要求越来越来越高,比如2015.16年的时候,运维只是做一些人力投入的事情,比如重启个服务,搭建一个nginx,mysql主从服务,简单的优化一下,就可以上线了, ...
- 【解决】Could not GET 'https://maven.google.com
现象 解决方案 1. 由于Google被墙导致的问题 参考 配置阿里云源修改maven的源地址. 2. 由于错误配置代理导致的问题(提示400) 查看工程目录下的gradle.properties和C ...
- Autofac 框架初识与应用
文字首发地址 一.前言 这上一篇中,主要讲述了什么是IoC容器,以及了解到它是DI构造函注入的框架,它管理着依赖项的生命周期以及映射关系,同时也介绍实践了在ASP.Net Core中,默认提供的内置I ...
- 02_利用numpy解决线性回归问题
02_利用numpy解决线性回归问题 目录 一.引言 二.线性回归简单介绍 2.1 线性回归三要素 2.2 损失函数 2.3 梯度下降 三.解决线性回归问题的五个步骤 四.利用Numpy实战解决线性回 ...
- 翻译:《实用的Python编程》09_01_Packages
目录| 上一节 (8.3 调试) | 下一节 (9.2 第三方包) 9.1 包 如果编写一个较大的程序,我们并不真的想在顶层将其组织为一个个独立文件的大型集合.本节对包(package)进行介绍. 模 ...
- Oracle-DG 主库将log_archive_dest_state_2远程归档线程参数设置为defer,为什么dg还是处于实时同步状态?
一.需求,前段时间,墨天伦有个小伙伴咨询了这个问题,搞了测试环境测试下. Oracle-DG 主库将log_archive_dest_state_2远程归档线程参数设置为defer,为什么dg还是处于 ...
- 一文吃透jQuery选择器!
1 jQuery选择器 jQuery选择器用于选择DOM元素进行相应操作,允许通过多种方式选择,包括标签名,属性名,类名,id等对元素进行选择,基于CSS选择器.jQuery中所有的选择器都以$符号开 ...
- shell脚本 3 流程控制
shell流程控制 流程控制是改变程序运行顺序的指令.linux shell有一套自己的流程控制语句,其中包括条件语句(if),循环语句(for,while),选择语句(case).下面我将通过例子介 ...
- 同事写了一个疯狂的类构造器,我要疯了,Builder 模式都不会么?!
疯狂的类构造器 最近栈长在做 Code Review 时,发现一段创建对象的方法: Task task = new Task(112, "紧急任务", "处理一下这个任务 ...
- 测试报告模板:HTMLTestRunner.py(新版)
报告样式效果: 报告源码:HTMLTestRunner.py 1 """ 2 A TestRunner for use with the Python unit test ...