要求

  • 给出两个整数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. vue 快速入门 系列 —— 侦测数据的变化 - [vue 源码分析]

    其他章节请看: vue 快速入门 系列 侦测数据的变化 - [vue 源码分析] 本文将 vue 中与数据侦测相关的源码摘了出来,配合上文(侦测数据的变化 - [基本实现]) 一起来分析一下 vue ...

  2. k8s删除节点

    k8s 删除节点 线上环境 # ctl get nodes NAME STATUS ROLES AGE VERSION 10.0.0.123 Ready <none> 104d v1.20 ...

  3. 《基于Kubernetes舵手集群的设计与实现》

    前言 <基于Kubernetes舵手集群的设计与实现>是我的毕业设计项目.本系统采用Kubernetes容器编排.基于Jenkins\Gitlab的CICD技术.EFK日志收集.Prome ...

  4. 三分钟玩转微软AI量化投资开源库QLib

    更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 微软QLib简介 微软亚洲研究院发布了 AI 量化投资开源平台"微矿 Qlib".Q ...

  5. SpringMVC时间格式和时区解决办法

    问题默认情况下在使用spring的@ResponseBody返回json串时,如果有日期类型的数据,会发现在日期会莫名其妙的差8小时比如:2017-12-20 10:16:23.0结果是:2017-1 ...

  6. Java刷题-stack

    一.getMin栈 题目描述 实现一个特殊功能的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作. 输入描述: 第一行输入一个整数N,表示对栈进行的操作总数. 下面N行每行输入一个字符串S ...

  7. 《青橙商城》day01避坑指南

    1.persistence-api报红 问题: 在模块qingcheng_pojo下的pom.xml中,报红 <dependencies> <dependency> <g ...

  8. 浅入Kubernetes(6):CKAD认证中的部署教程

    目录 预设网络 kubeadm 安装 k8s 配置 calico 自动补全工具 状态描述 目前为止,笔者已经写了 5 篇关于 k8s 的文章,这一篇笔者将介绍 CKAD 认证官方课程中,如何部署 k8 ...

  9. Docker安装Nacos动态服务发现、配置和服务管理平台

    一.通过DockerHub拉镜像,版本查看:https://github.com/nacos-group/nacos-docker //稳定版,有权限 docker pull nacos/nacos- ...

  10. 【Java基础】ConcurrentHashMap为什么不能存null键和null值

    代码如下 /** * 测试ConcurrentHashMap null键和null值的问题 * @return */ @RequestMapping(value = "/get_nacos& ...