题目:

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],
]
Hide Tags

Backtracking 

链接:  http://leetcode.com/problems/combinations/

题解:

求组合数。依然是使用recursive + backtracking,当所传list的大小等于k时,将list加入到result里。使用控制位置的变量pos根据题目要求从1开始,本体依然假定无重复数字。

Time Complexity - O(2n), Space Complexity - O(n)。                         --复杂度有点糊涂,还需要重新计算

public class Solution {
public ArrayList<ArrayList<Integer>> combine(int n, int k) {
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
if(n < 0 || k < 0)
return result;
ArrayList<Integer> list = new ArrayList<Integer>();
helper(result, list, n, k, 1);
return result;
} private void helper(ArrayList<ArrayList<Integer>> result, ArrayList<Integer> list, int n, int k, int pos){
if(list.size() == k){
result.add(new ArrayList<Integer>(list));
return;
} for(int i = pos; i <= n; i++){
list.add(pos);
helper(result, list, n, k, ++pos);
list.remove(list.size() - 1);
}
}
}

Update:

public class Solution {
public List<List<Integer>> combine(int n, int k) {
List<List<Integer>> res = new ArrayList<>();
if(n < 0 || k < 0)
return res;
ArrayList<Integer> list = new ArrayList<Integer>();
dfs(res, list, n, k, 1);
return res;
} private void dfs(List<List<Integer>> res, ArrayList<Integer> list, int n, int k, int position) { // from 1 to n
if(list.size() == k) {
res.add(new ArrayList<Integer>(list));
return;
} for(int i = position; i <= n; i++) {
list.add(i);
dfs(res, list, n, k, i + 1);
list.remove(list.size() - 1);
}
}
}

二刷

有关这一类排列组合题目有不少题型,一定要好好思考总结融会贯通。

依然是跟1刷类似的方法,使用DFS + Backtracking。要注意的是最后的结果是(1, 2), (1, 3), (1, 4), (2, 3), (2, 4)这类一定是升序的组合,所以我们构建辅助函数的时候只要pass in 一个position来控制就可以了。递归的时候传入 combine(res, list, k, n, i + 1)这样就能简单避免掉i,只丛i后面的数字继续遍历。

这里branching factor是n, depth是k。 所以其实时间复杂度是 O(n! / k!) 约等于 O(n!)

Time Complexity - O(n!), Space Complexity - O(nk)

Java:

public class Solution {
public List<List<Integer>> combine(int n, int k) {
List<List<Integer>> res = new ArrayList<>();
List<Integer> list = new ArrayList<>();
combine(res, list, n, k, 1);
return res;
} private void combine(List<List<Integer>> res, List<Integer> list, int n, int k, int pos) {
if (list.size() == k) {
res.add(new ArrayList<Integer>(list));
return;
}
for (int i = pos; i <= n; i++) {
list.add(i);
combine(res, list, n, k, i + 1);
list.remove(list.size() - 1);
}
}
}

三刷:

方法跟二刷一样。也是构造递归求解的辅助方法来解决。注意这里我们也需要一个保存position的int pos。

有机会要再算一算复杂度。

Java:

public class Solution {
public List<List<Integer>> combine(int n, int k) {
List<List<Integer>> res = new ArrayList<>();
if (n < 0 || k < 0 || n < k) return res;
getCombinations(res, new ArrayList<Integer>(), n, k, 1);
return res;
} private void getCombinations(List<List<Integer>> res, List<Integer> list, int n, int k, int pos) {
if (list.size() == k) {
res.add(new ArrayList<>(list));
return;
}
for (int i = pos; i <= n; i++) {
list.add(i);
getCombinations(res, list, n, k, i + 1);
list.remove(list.size() - 1);
}
}
}

Reference:

http://www.1point3acres.com/bbs/thread-117602-1-1.html

http://codeganker.blogspot.com/2014/03/combinations-leetcode.html

http://www.cnblogs.com/zhuli19901106/p/3485751.html

http://www.1point3acres.com/bbs/thread-117602-1-1.html

https://leetcode.com/discuss/42034/java-solution-easy-understood

https://leetcode.com/discuss/30221/dfs-recursive-java-solution

https://leetcode.com/discuss/61607/ac-python-backtracking-iterative-solution-60-ms

https://leetcode.com/discuss/37021/1-liner-3-liner-4-liner

https://leetcode.com/discuss/24600/iterative-java-solution

https://leetcode.com/discuss/12915/my-shortest-c-solution-using-dfs

https://leetcode.com/discuss/31250/backtracking-solution-java

http://rangerway.com/way/algorithm-permutation-combination-subset/

http://www.1point3acres.com/bbs/thread-117602-1-1.html

http://www.cnblogs.com/zhuli19901106/p/3492515.html

77. Combinations的更多相关文章

  1. Leetcode 77, Combinations

    Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For exampl ...

  2. 77. Combinations(medium, backtrack, 重要, 弄了1小时)

    Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For exampl ...

  3. 【一天一道LeetCode】#77. Combinations

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given t ...

  4. [leetcode]77. Combinations组合

    Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. Example: I ...

  5. 77. Combinations (java 求C(n,k)的组合,排除重复元素)

    题目: Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. 解析:同求全 ...

  6. (效率低下)77. Combinations C++回溯法 组合

    https://leetcode.com/problems/combinations/ 沿用78题的思路 class Solution { public: void backTrack(vector& ...

  7. LeetCode OJ 77. Combinations

    题目 Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For exa ...

  8. LeetCode 77 Combinations(排列组合)

    题目链接:https://leetcode.com/problems/combinations/#/description    Problem:给两个正数分别为n和k,求出从1,2.......n这 ...

  9. 77. Combinations(回溯)

    Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. Example: I ...

随机推荐

  1. Ubuntu12.10编译openwrt遇到的错误

    由于Openwrt有很多工具是要先编译的,在Ubuntu12.10平台下编译openwrt时就遇到了下面这样的错误:elf.cpp: In static member function 'static ...

  2. 世界级Oracle专家Jonathan Lewis:我很为DBA们的未来担心(图灵访谈)

    部分节选 图灵社区:如果您的子女对计算机科学感兴趣,你会让他们选什么具体的方向呢? JL:我的孩子对计算机科学一点都不感兴趣,甚至对科学都没什么兴趣.他们主修的都是艺术.如果要我给其他的人建议的话,我 ...

  3. EWOULDBLOCK = EAGAIN

    #define EAGAIN 11 /* Try again */ #define EINTR 4 /* Interrupted system call */ #define EWOULDBLOCK ...

  4. ActiveMQ.xml文件的主要配置

    ActiveMQ.xml文件默认位置位于 activemq/conf/目录下,主要的配置及解析如下:<beans xmlns="http://www.springframework.o ...

  5. MS MQ 消息队列

    一.安装 先在 控制面板—程序和功能—打开或关闭我windows功能.把 msmq全勾起来 如下图: 二.右击-消息对列—属性—服务器安全性,把禁用未经身份验证的RPC调用勾去掉, 三.然后在专用队列 ...

  6. php必看六本书

    php和mysql web开发 PHP高级程序设计_模式.框架与测试.pdf  PHP专业项目实例开发.pdf PHP5高级应用开发实践.pdf [深入PHP面向对象.模式与实践(第2版)].(美)赞 ...

  7. Notes of the scrum meeting(10/28)

    meeting time:4:00~6:00p.m.,October 28th,2013 meeting place:雕刻时光 attendees: 顾育豪                       ...

  8. 简单易用的导出文件(Excel、word等各种格式)的方法

    以前学习过NPOI导出数据到Excel中,代码较长,不易记忆.工作中,看到了其他同事写的代码,研究了一下,贴出来,共同学习. 使用这种方式,不仅可以设置表格的样式,而且代码简洁. 首先,在后台中通过S ...

  9. Python Socket File Transfer

    I have a RPi which I intented to use it to crawl data. The development environment in RPi is very ba ...

  10. SQL Server表分区【转】

    转自:http://www.cnblogs.com/knowledgesea/p/3696912.html SQL Server表分区   什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在 ...