分治法解决组合问题(递归)
大问题转换为小问题
求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;
分治法解决组合问题(递归)相关推荐
- 分治法解决组合总和问题(leetcode216)
nums数组中元素是正整数 大问题转换为小问题 思路和分治法解决组合相同,代码也相似 分治法解决组合问题(递归)_m0_52043808的博客-CSDN博客 只不过递归出口时需要判断组合总和是否为n ...
- 分治法解决循环赛日程表
分治法解决循环赛日程表 问题描述 设有n=2^k个运动员要进行羽毛球循环赛,现要设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次. (2)每个选手一天只能比赛一次. ( ...
- 分治法解决矩阵乘法问题
分治法解决矩阵乘法问题 传统for循环: #include<iostream> #include<cstdio> #include <vector> #includ ...
- 分治法解决棋盘覆盖问题
分治法解决棋盘覆盖问题 问题描述: 在一个2k×2k(k≥0)个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为特殊方格.显然,特殊方格在棋盘中出现的位置有4k中情形,因而有4k中不同的棋盘. ...
- 分治法解决最小套圈问题
/* Copyright by ZhongMing-Bian Jan,6,2010 */ /* 分治法解决最小套圈问题 ...
- 分治法解决最大子数组问题
分治法解决最大子数组问题 参考文章: (1)分治法解决最大子数组问题 (2)https://www.cnblogs.com/Christal-R/p/Christal_R.html (3)https: ...
- 分治法解决最近点对问题
问题 给定平面上n个点,找其中的一对点,使得在n个点的所有点对中,该点对的距离最小.严格地说,最接近点对可能多于1对.为了简单起见,这里只限于找其中的一对. 原理(这段为抄袭https://blog. ...
- 蛮力法与分治法解决最近点对问题-详细分析与C++代码实现
最近点对问题 最近点对问题の目录 最近点对问题 什么是最近点对问题 代码基本框架 蛮力法及其代码 分治法及其代码 一般分治法遇到的特殊情况 如何优化分治法(6点确定与4点确定解法) 优化后分治法(4点 ...
- 【数据结构与算法设计-基础向】C/C++编程练习 - 套圈(分治法解决最近对问题)
题目: Have you ever played quoit in a playground? Quoit is a game in which flat rings are pitched at s ...
最新文章
- windows编辑好的python代码在linux的vim编辑,缩进问题
- Python 的闭包和装饰器
- 局域网网速带宽测试软件,网管的经验 教你如何测试局域网的网速
- 征名公布|Qtum量子链企业版—Unita 中文名征集圆满落幕
- 签入在服务器上之后,别人获取了,在解决方案资源管理器中找不到。
- java数据包解析_请教http请求数据包如何解析 重组
- 基于centos6.5搭建solr服务器
- yocto生成各种格式的文件系统
- 什么样的人适合做自动化测试
- 利用ActiveSync制作PC端安装程序(By 无聊客)
- 装黑苹果卡在苹果图标_EFI + Clover引导,已装好系统,重启进系统卡在苹果logo,似乎是显卡问题……...
- Python自动采集微信联系人
- Android校招复习资料整理
- 【优化算法】加权黑猩猩优化算法(WChOA)(Matlab代码实现)【与ChOA、PSO、WOA、BH、ALO、GA和GWO算法比较】
- p5.js 和 Processing 的恩怨情仇
- vsftpd服务的黑名单和白名单
- arcgis js 4 风场可视化
- Fast Abstractive Summarization with Reinforce-Selected Sentence Rewriting
- 关于耳机与电脑连接断断续续问题的解决办法
- “东数西算”取得新进展,发改委等四部门发文构建国家算力网络体系 | 产业区块链发展周报...
热门文章
- 人性歪曲的心理调适 一【虚荣心理、投机心理、狭隘心理、吝啬心理、逆反心理】...
- ICPC程序设计题解书籍系列之五:吴永辉:《数据结构编程实验》(第2版)
- Vijos P1597 2的幂次方【进制+递归】
- Tarjan算法查找强联通组件的程序
- Identity of indiscernibles(不可分与同一性)
- matlab 解析 mnist 数据集
- hash function/ hash table 背后的数学基础
- C++::增加目标码(object code)的大小的操作
- python能做什么项目-Python 的练手项目有哪些值得推荐?
- python编程入门-最好的Python入门教材是哪本?