大问题转换为小问题

求nums数组中k个数的所有组合,只要确定第一个数,

问题转化为求第一个数之后的数组k-1个数的所有组合,然后在这些组合里加上第一个数

递归出口:

(1)如果k=1,则可以直接写出数组的所有组合(每个元素都是一个组合)

(2)如果数组的个数等于k,那组合就是nums本身

解释:k在递归过程中不断减少,数组的个数在递归过程中不断减少,当减少到以上两种情况时,所有的组合情况可以直接写出来,所有是递归出口

递归体:

第一个数可能去nums[0],nums[1],...nums[j],j最大不能超过数组个数减-k,(如果超过,则nums[j]之后的数不足k个,返回空集合)

所以,要写一个循环,把每一个nums[i]作为第一个元素的组合收集在一起,就是最终的结果

for(int i=0;i<nums.size()-k+1;i++)
{//求出nums[i]作为第一个数的所有组合//把组合加到结果中}

递归函数声明

求nums数组的k个数的所有组合,结果返回一个二维数组

vector<vector<int>> combine(vector<int>&nums, int k);

代码

  vector<vector<int>> combine(vector<int>&nums, int k) {vector<vector<int>>res;if (nums.size() == k){res.push_back(nums);return res;}//保证nums.size()在递归中一直变小if (k == 1)//保证k在递归中一直变小{vector<int>temp;for (int i = 0; i < nums.size(); i++){temp.push_back(nums[i]);res.push_back(temp);temp.pop_back();}return res;}vector<vector<int>>ans;for (int i = 0; i < nums.size() - k+1; i++){vector<vector<int>>temp;vector<int>n_nums(nums.begin() + i+1, nums.end());temp= combine(n_nums, k - 1);vector<int>single;single.push_back(nums[i]);for (int j = 0; j < temp.size(); j++){temp[j].insert(temp[j].end(), single.begin( ), single.end());}for (int i = 0; i < temp.size(); i++){ans.push_back(temp[i]);}}return ans;

分治法解决组合问题(递归)相关推荐

  1. 分治法解决组合总和问题(leetcode216)

    nums数组中元素是正整数 大问题转换为小问题 思路和分治法解决组合相同,代码也相似 分治法解决组合问题(递归)_m0_52043808的博客-CSDN博客 只不过递归出口时需要判断组合总和是否为n ...

  2. 分治法解决循环赛日程表

    分治法解决循环赛日程表 问题描述 设有n=2^k个运动员要进行羽毛球循环赛,现要设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次. (2)每个选手一天只能比赛一次. ( ...

  3. 分治法解决矩阵乘法问题

    分治法解决矩阵乘法问题 传统for循环: #include<iostream> #include<cstdio> #include <vector> #includ ...

  4. 分治法解决棋盘覆盖问题

    分治法解决棋盘覆盖问题 问题描述: 在一个2k×2k(k≥0)个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为特殊方格.显然,特殊方格在棋盘中出现的位置有4k中情形,因而有4k中不同的棋盘. ...

  5. 分治法解决最小套圈问题

    /*     Copyright    by ZhongMing-Bian     Jan,6,2010   */ /*             分治法解决最小套圈问题                 ...

  6. 分治法解决最大子数组问题

    分治法解决最大子数组问题 参考文章: (1)分治法解决最大子数组问题 (2)https://www.cnblogs.com/Christal-R/p/Christal_R.html (3)https: ...

  7. 分治法解决最近点对问题

    问题 给定平面上n个点,找其中的一对点,使得在n个点的所有点对中,该点对的距离最小.严格地说,最接近点对可能多于1对.为了简单起见,这里只限于找其中的一对. 原理(这段为抄袭https://blog. ...

  8. 蛮力法与分治法解决最近点对问题-详细分析与C++代码实现

    最近点对问题 最近点对问题の目录 最近点对问题 什么是最近点对问题 代码基本框架 蛮力法及其代码 分治法及其代码 一般分治法遇到的特殊情况 如何优化分治法(6点确定与4点确定解法) 优化后分治法(4点 ...

  9. 【数据结构与算法设计-基础向】C/C++编程练习 - 套圈(分治法解决最近对问题)

    题目: Have you ever played quoit in a playground? Quoit is a game in which flat rings are pitched at s ...

最新文章

  1. windows编辑好的python代码在linux的vim编辑,缩进问题
  2. Python 的闭包和装饰器
  3. 局域网网速带宽测试软件,网管的经验 教你如何测试局域网的网速
  4. 征名公布|Qtum量子链企业版—Unita 中文名征集圆满落幕
  5. 签入在服务器上之后,别人获取了,在解决方案资源管理器中找不到。
  6. java数据包解析_请教http请求数据包如何解析 重组
  7. 基于centos6.5搭建solr服务器
  8. yocto生成各种格式的文件系统
  9. 什么样的人适合做自动化测试
  10. 利用ActiveSync制作PC端安装程序(By 无聊客)
  11. 装黑苹果卡在苹果图标_EFI + Clover引导,已装好系统,重启进系统卡在苹果logo,似乎是显卡问题……...
  12. Python自动采集微信联系人
  13. Android校招复习资料整理
  14. 【优化算法】加权黑猩猩优化算法(WChOA)(Matlab代码实现)【与ChOA、PSO、WOA、BH、ALO、GA和GWO算法比较】
  15. p5.js 和 Processing 的恩怨情仇
  16. vsftpd服务的黑名单和白名单
  17. arcgis js 4 风场可视化
  18. Fast Abstractive Summarization with Reinforce-Selected Sentence Rewriting
  19. 关于耳机与电脑连接断断续续问题的解决办法
  20. “东数西算”取得新进展,发改委等四部门发文构建国家算力网络体系 | 产业区块链发展周报...

热门文章

  1. 人性歪曲的心理调适 一【虚荣心理、投机心理、狭隘心理、吝啬心理、逆反心理】...
  2. ICPC程序设计题解书籍系列之五:吴永辉:《数据结构编程实验》(第2版)
  3. Vijos P1597 2的幂次方【进制+递归】
  4. Tarjan算法查找强联通组件的程序
  5. Identity of indiscernibles(不可分与同一性)
  6. matlab 解析 mnist 数据集
  7. hash function/ hash table 背后的数学基础
  8. C++::增加目标码(object code)的大小的操作
  9. python能做什么项目-Python 的练手项目有哪些值得推荐?
  10. python编程入门-最好的Python入门教材是哪本?