1 解题思路
适逢期末,事情比较多,而且最近心好烦,所以更新不规律了一点,“大姨爹”来了吧。
所谓组合问题,可以理解为在1..n个数字里面,选k个数字,那么能选出多少种呢?注意,这里只要求组合,不要求排列,即12和21并不区别。
在数学上的话就是C的那个符号了,这里不好表述,排列组合的话就是A那个符号了。
因此这道题也很简单,直接递归顺序填入数字就可以
规则是,下一位填入的数字,不得小于当前的,其他没有了
例如开头可以选1.那么第二个只能选2…等。。把所有可能搜索一遍选一个,刚好遍历完成。
这道题其实就是经典的排列组合问题。。我依稀中有一种神秘的解法,但是我记不得了。现在写的这个,最后AC后运行时间很靠前,我也就不纠结了。
2 原题
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],
]
3 AC解
public class Solution {
/**
* 直接递归就可以:
* 规则是,下一位填入的数字,不得小于当前的,其他没有了
* */
List<List<Integer>> result;
public void find(int n,int remains,List<Integer> tmp,int index){
if(remains==0){
List<Integer> t= new ArrayList<Integer>();
t.addAll(tmp);
result.add(t);
return ;
}
//注意最右边那个条件,是为了防止无用的递归,因为剩下的位数必须要足够,所以加入了一个判断
for(int i=index;i<=n && i+remains-1<=n;i++){
tmp.add(i);
find(n,remains-1,tmp,i+1);
tmp.remove(tmp.size()-1);
}
}
public List<List<Integer>> combine(int n, int k) {
result=new ArrayList<List<Integer>>();
find(n,k,new ArrayList<Integer>(),1);
return result;
}
}