leetcode第一刷_Combinations
来源:互联网 发布:淘宝网大童店铺 编辑:程序博客网 时间:2024/05/17 04:38
生成组合数是初中的知识,没有人不知道。组合数学我认为是最有意思的数学分支,室友应该是这方面的专家,他的纸牌问题我听都听不懂。。
不知道你们是什么感觉,我以看到组合数,马上会想到全排列,这可能是因为当时初中的时候,这两部分知识是放在一起讲的,也确实有一些联系。怎样生成全排列算法课在递归的那部分讲过,写的也比较多,很多字符串的问题我都忍不住想用全排列试一下。那能不能用递归的方法来生成组合数呢?
答案当然是肯定的,毕竟这种事情递归再合适不过了。递归的关键是什么呢,怎样把大规模转化成小规模,然后小规模再一层层的回溯成大规模。单就生成组合数的问题来说,大规模和小规模是什么呢?答案是C(n,k)与C(n-1, k-1)。去掉的这个1,是在此次递归中选取的那个数,选取的这个数到底是什么呢?注意到选择这个数的时候一定要避免后面递归时重复的选到它,因此最简单的策略就是选择当前能选的最大的那个。根据组合数的定义,这个数的值域应该是[k, n],问题解决了。编码的问题很简单。
注意一点是题目要求最后是按照升序排列的,因此要做一次排序,这是不太优雅的地方,也许换一种挑数的策略,就可以省去这一步,不过我觉得应该不如这种方法简单易理解。
class Solution {public: void getCombine(int n, int k, vector<int> &tpres, vector<vector<int> > &res){ for(int i=n;i>=k;i--){ tpres.push_back(i); if(k>1) getCombine(i-1, k-1, tpres, res); else{ vector<int> tt = tpres; sort(tt.begin(), tt.end()); res.push_back(tt); } tpres.pop_back(); } } vector<vector<int> > combine(int n, int k) { vector<vector<int> > res; vector<int> tpres; getCombine(n, k, tpres, res); return res; }};
0 0
- leetcode第一刷_Combinations
- LeetCode--77_Combinations
- leetcode第一刷_Candy
- leetcode第一刷_Triangle
- leetcode第一刷_Anagrams
- leetcode第一刷_Permutations
- leetcode第一刷_Triangle
- leetcode第一刷_3Sum
- leetcode第一刷_4Sum
- leetcode第一刷_Sort List
- leetcode第一刷_LRU Cache
- leetcode第一刷_Two sum
- leetcode第一刷_ZigZag Conversion
- leetcode第一刷_Reverse Integer
- leetcode第一刷_Palindrome Number
- leetcode第一刷_Submission Details
- leetcode第一刷_Word Break
- leetcode第一刷_Gas Station
- 关于正方体的姿态问题
- Proxifier
- Frame Relay封装协议cisco & IETF
- HDOJ1038 Biker's Trip Odometer
- c++中union的使用,看高手们如何解释的
- leetcode第一刷_Combinations
- 软件或产品的 LTS 和 EOL
- VMwareWorkstation10 中安装Centos6.5(64位)图文并茂详细步骤
- linux杂谈(二十):apache服务配置
- 【c++】虚函数描述符override
- Machine Learning(Andrew)Week8(上)
- 关于ArcGIS Server10.1 for Windows站点管理员无法登陆的问题
- 最小生成树算法
- 【玩转微信公众平台之一】序章(纯粹扯淡)