Combinations
来源:互联网 发布:java调用构造方法是在 编辑:程序博客网 时间:2024/05/19 13:22
【题目】
Given two integers n and k, return all possible combinations of k numbers out of 1 ... n.
For example,
If n = 4 and k = 2, a solution is:
[ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4],]
【题意】:题意给我们一个数字n, 和一个数字k,让我们求出从 1~~n中取出k个数所能得到的组合数
【解析】:
DFS解决组合题的经典案例
用递归来求解.如果要是用循环来求解,这个时间复杂度应该是比较恐怖了.并且,这个递归是一层一层往深处去走的,打个比方,我们一个循环,首先求得以1开始的看个数的combination,之后再求以2开始的,以此类推,所以开始是对n个数做DFS, n-1个数做DFS...所以应该是对n(n-1)...*1做DFS. 在程序中,我们可以加一些剪枝条件来减少程序时间.
时间复杂度: 在题目分析中,我们提到了对于对n,n-1,...,1做DFS,所以时间复杂度是O(n!)
实现:
public class Solution { public ArrayList<ArrayList<Integer>> combine(int n, int k) { ArrayList<ArrayList<Integer>> rel = new ArrayList<ArrayList<Integer>>(); ArrayList<Integer> temp = new ArrayList<Integer>(); subsetsRec(rel, temp, n, k, 0); return rel; } private void subsetsRec(ArrayList<ArrayList<Integer>> rel, ArrayList<Integer> temp, int n, int k, int level){ if(temp.size() == k) { rel.add(new ArrayList<Integer>(temp) ); return; } for(int i=level; i<n; i++) { temp.add( i+1 ); subsetsRec(rel, temp, n, k, i+1); temp.remove(temp.size() -1); } }}
c++:
class Solution {public: vector<vector<int> > combine(int n, int k) { vector<vector<int>> result; vector<int> oneResult; Insert(result, oneResult, 0, k, n); return result; } void Insert(vector<vector<int>> &result, vector<int> &oneResult, int level, int k, int n){ if(oneResult.size() == k){//use oneResult.size() instead of level result.push_back(oneResult); return; } for(int i = level; i < n; i++){ oneResult.push_back(i+1); Insert(result, oneResult, i+1, k, n); oneResult.pop_back(); } }};
https://siddontang.gitbooks.io/leetcode-solution/content/backtracking/combination.html
0 0
- Combinations
- Combinations
- Combinations
- Combinations
- Combinations
- Combinations
- Combinations
- Combinations
- Combinations
- Combinations
- Combinations
- Combinations
- Combinations
- combinations
- Combinations
- Combinations
- Combinations
- Combinations
- 如何理解和使用java package
- C# 获取windows特殊路径
- 今天开始在csdn写博客了,记录下自己趟过的坑~
- C#中的invoke和begininvoke
- 从JDK源码角度看java并发的公平性
- Combinations
- UBUNTU实战(2)
- 接口与抽象类的区别
- uva10130 01背包加强版
- 公司代理上网环境下gem和cocoapods 使用教程
- UFLDL 10 建立分类用深度学习网络 (含梯度弥散的原因)
- jQuery中each的用法之退出循环和结束本次循环
- 插入排序——一步一步算法篇
- ROS_Kinetic_02 ROS Kinetic 迁移指南及中文wiki指南(Migration guide)