题目链接:https://leetcode.com/problems/combinations/
题目:
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],
]
解题思路:
一开始总想用非递归来做,弄了半天也没弄出来,遂改为递归的做法,很快解决。
很高兴我能和大神的思路完全一致,看来就得是递归,np 问题无法再优化。
大神解法参考:http://blog.youkuaiyun.com/linhuanmars/article/details/21260217
做这道题时有些 java 语法的小问题需要引起注意:
1、List < List< Integer>> res 添加(add)List< Integer> list,是添加 list 的引用。即,若更改 list 的内容,res 中的内容也被修改了
2、在用 for(List< Intger> l : res) 迭代遍历时,不能删除正在被遍历的 res 中内容
3、list.remove() 有两种重载形式,一种参数为对象,另一种参数为下标。若对象本身是普通类型,如整型,那么java默认将整型看做是下标
代码实现:
public class Solution {
public List<List<Integer>> combine(int n, int k) {
List<List<Integer>> res = new ArrayList();
if(n<=0 || n<k)
return res;
help(new ArrayList(), k, n, 1, res);
return res;
}
void help(List<Integer> list, int k, int n, int start, List<List<Integer>> res) {
if(list.size() == k) {
res.add(new ArrayList(list));
return;
}
for(int i = start; i <= n; i ++) {
list.add(i);
if(list.size() + n - start >= k)
help(list, k, n, i + 1, res);
list.remove(list.size() - 1);
}
}
}
26 / 26 test cases passed.
Status: Accepted
Runtime: 3 ms